#include<stdio.h>
#include<string.h>
int dp[21][21];
int num;
int temp[21];
int answer[21];
void ini()
{
for(int i=0;i<21;++i)
{
for(int j=0;j<21;++j)
{
dp[i][j]=0;
}
}
}
int max(int a,int b)
{
if(a>b)
return a;
return b;
}
void solve()
{
memset(dp,0,sizeof(dp));
for(int i=1;i<=num;++i)
{
for(int j=1;j<=num;++j)
{
if(answer[i]==temp[j])
{
dp[i][j]=dp[i-1][j-1]+1;
}
else
{
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
}
}
int main()
{
int a;
scanf("%d",&num);
for(int i=1;i<=num;++i)
{
scanf("%d",&a);
answer[a]=i;
}
while(scanf("%d",&a)!=EOF)
{
temp[a]=1;
for(int j=2;j<=num;++j)
{
scanf("%d",&a);
temp[a]=j;
}
ini();
solve();
printf("%d\n",dp[num][num]);
}
return 0;
}
最长公共子序列问题,要求的结果为与正确答案的最长公共子序列的长度。。。
输入略恶心。。每个位置的数字代表他应该在的位置
比如 4 2 1 3 事件1应该排在第四位 2排在第二位。。。。
贴代码。。。