题目:最大公共子序列或最大上升子序列。
分析:dp、LIS或LCS。LIS和LCS之间课转换,按串1的顺序求串2的LIS即可。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char str[ 128 ];
char val[ 128 ];
int f[ 128 ][ 128 ];
int main()
{
int T = 1;
while ( gets(val) && val[0] != '#' ) {
gets(str);
int l1 = strlen(val);
int l2 = strlen(str);
memset( f, 0, sizeof(f) );
for ( int i = 1 ; i <= l1 ; ++ i )
for ( int j = 1 ; j <= l2 ; ++ j )
if ( val[i-1] == str[j-1] )
f[i][j] = f[i-1][j-1]+1;
else {
f[i][j] = f[i-1][j];
if ( f[i][j] < f[i][j-1] )
f[i][j] = f[i][j-1];
}
printf("Case #%d: you can visit at most %d cities.\n",T ++,f[l1][l2]);
}
return 0;
}