您的位置:首页 > 其它

[UVA 111] History Grading

2012-01-29 17:54 363 查看
本题目本质上就是求解两个序列的最长公共子序列。代码中的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

);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: