您的位置:首页 > 其它

UVA 111 History Grading

2011-11-02 20:06 183 查看
UVA_111

这个题目并不困难,但是题意理解起来很蛋疼。

题目的意思是求两个事件序列的最长公共子序列,而题目中输入的是每个事件发生的时间,因而要先根据每个事件发生的时间把事件的序列的找到。

比如如果输入是1 3 4 2,那么实际上事件序列是1 4 2 3。

#include<stdio.h>
#include<string.h>
#define MAXD 30
int N, a[MAXD], b[MAXD], f[MAXD][MAXD];
int init()
{
int i, k;
for(i = 1; i <= N; i ++)
{
if(scanf("%d", &k) != 1)
return 0;
b[k] = i;
}
return 1;
}
void solve()
{
int i, j;
memset(f, 0, sizeof(f));
for(i = 1; i <= N; i ++)
for(j = 1; j <= N; j ++)
{
f[i][j] = f[i - 1][j];
if(f[i][j - 1] > f[i][j])
f[i][j] = f[i][j - 1];
if(a[i] == b[j] && f[i - 1][j - 1] + 1 > f[i][j])
f[i][j] = f[i - 1][j - 1] + 1;
}
printf("%d\n", f

);
}
int main()
{
int i, k;
scanf("%d", &N);
for(i = 1; i <= N; i ++)
{
scanf("%d", &k);
a[k] = i;
}
while(init())
solve();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: