您的位置:首页 > 其它

UVa 111 - History Grading

2013-08-26 20:35 501 查看
  题目大意:有n个历史事件,需要对他们按发生的时间先后进行排名。给出正确的排名顺序和学生排出的顺序,按学生答案中最长的正确相对顺序序列的长度给分,计算学生能得多少分。如正确顺序是1,2,3,4,学生答案为1,3,2,4,学生可得三分(123和134序列均可)。

  就是求两个序列的最长公共序列(LCS),经典问题,要注意的就是题中给出的是事件的排名,要转化成排名后的事件序列。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAXN 25

int correct[MAXN], query[MAXN];
int dp[MAXN][MAXN];

int main()
{
#ifdef LOCAL
freopen("in", "r", stdin);
#endif
int n;
scanf("%d", &n);
int x;
for (int i = 1; i <= n; i++)
{
scanf("%d", &x);
correct[x] = i;
}
while (scanf("%d", &x) != EOF)
{
query[x] = 1;
for (int i = 2; i <= n; i++)
{
scanf("%d", &x);
query[x] = i;
}
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
{
if (correct[i] == query[j])  dp[i][j] = dp[i-1][j-1] + 1;
else  dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
}
printf("%d\n", dp

);
}
return 0;
}


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