IT民工
加油!

这道题的输入比较奇葩,先输入N,再输入事件号,事件对应的时间是输入序列中的编号。

然后再求序列c与序列r的最长公共子序列。

#include<stdio.h>
#include<string.h>
#define MAXD 25
int d[MAXD][MAXD], c[MAXD], r[MAXD];
int N;
int max( int a, int b)
{
return a > b ? a : b;
}

void dp()
{
memset( d, 0, sizeof d);
for( int i = 1; i <= N; i ++)
for( int j = 1; j <= N; j ++)
{
d[i][j] = max( d[i - 1][j], d[i][j - 1]);
if( c[i] == r[j] )
d[i][j] = max( d[i - 1][j - 1] + 1, d[i][j]);
}
}

int main()
{
int a;
while( scanf( "%d", &N) == 1)
{
for( int i = 1; i <= N; i ++) {
scanf( "%d", &a);
c[a] = i;
}
int j = 0;
while( scanf( "%d", &a) == 1)
{
r[ a] = ++j;
if( j == N) {
j = 0;
dp();
printf( "%d\n", d[N][N]);
}
}
}
return 0;
}

 

posted on 2011-11-30 17:50  找回失去的  阅读(235)  评论(0编辑  收藏  举报