题目描述
给出 1,2,…,n 的两个排列 P1 和 P2 ,求它们的最长公共子序列。
输入格式
第一行是一个数 n。
接下来两行,每行为 n 个数,为自然数1,2,…,n 的一个排列。
输出格式
一个数,即最长公共子序列的长度。
输入输出样例
输入 #1复制
5 3 2 1 4 5 1 2 3 4 5
输出 #1复制
3
说明/提示
- 对于 50%50% 的数据, n≤103;
- 对于 100%100% 的数据, n≤105。
今天系统性的学了一下动态规划结果搞半天WA50其余全是TLE.看来代码还有待优化,明天继续。
#include<stdio.h>
int dp[100005],a[100005],b[100005];
int max(int x,int y)
{
if(x>y)
return x;
return y;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
scanf("%d",&b[i]);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i]==b[j])
dp[j]=dp[j]+1;
else
dp[j]=max(dp[j],dp[j-1]);
}
}
printf("%d ",dp[n]);
return 0;
}