本题目本质上就是求解两个序列的最长公共子序列。代码中的chron[i]和respone[i]分别表示在历史中第i个发生的事件chron[i](正确时间顺序下)和事件respone[i](学生认为在此时发生的)。
代码如下:
#include <stdio.h>
#define MAX 30
int chron[MAX];
int respone[MAX];
int f[MAX][MAX];
int main()
{
int i,c,n,j;
scanf("%d",&n);
for(i = 1;i <= n;i++)
{
scanf("%d",&c);
chron[c] = i;
}
while(scanf("%d",&c) != EOF)
{
respone[c] = 1;
for(i = 2;i <= n;i++)
{
scanf("%d",&c);
respone[c] = i;
}
for(i = 1;i <= n;i++)
f[i][0] = f[0][i] = 0;
for(i = 1;i <= n;i++)
{
for(j = 1;j <= n;j++)
{
if(chron[i] == respone[j])
f[i][j] = f[i-1][j-1] + 1;
else if(f[i-1][j] >= f[i][j-1])
f[i][j] = f[i-1][j];
else
f[i][j] = f[i][j-1];
}
}
printf("%d\n",f[n][n]);
}
return 0;
}