题意
LCS
思路
LCS
代码
#include <cstdio>
#include <cstring>
#include <iostream>
#define N 505
using namespace std;
int len1, len2;
char s1[ N ], s2[ N ];
int dp[ N ][ N ];
inline int max ( int a, int b ) { return a > b ? a : b; }
void LCS () {
for ( int i = 1; i <= len1; i++ ) {
for ( int j = 1; j <= len2; j++ ) {
if ( s1[ i ] == s2[ j ] )
dp[ i ][ j ] = dp[ i - 1 ][ j - 1 ] + 1;
else
dp[ i ][ j ] = max ( dp[ i - 1 ][ j ], dp[ i ][ j - 1 ] );
}
}
}
void Print ( int i, int j ) {
//当最长的子序列搜索完,但其中一串仍有剩余时,输出
if ( i == 0 || j == 0 ) {
return;
}
//找到公共字符
if ( s1[ i ] == s2[ j ] ) {
Print ( i - 1, j - 1 );
printf ( "%c", s1[ i ] );
} else if ( dp[ i - 1 ][ j ] > dp[ i ][ j - 1 ] ) {
Print ( i - 1, j );
} else {
Print ( i, j - 1 );
}
}
int main () {
while ( ~scanf ( "%s%s", s1 + 1, s2 + 1 ) ) {
len1 = strlen ( s1 + 1 );
len2 = strlen ( s2 + 1 );
memset ( dp, 0, sizeof ( dp ) );
LCS ();
printf ( "%d\n", dp[ len1 ][ len2 ] );
}
return 0;
}