UVA 111 History Grading

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[N][N]);
}
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;
}


原文地址:https://www.cnblogs.com/staginner/p/2233524.html