最长公共子序列
转移方程
dp[i][j] = max ( dp[i][j] , dp[i-1][j-1] + 1 ) ( s1[i] == s2[j] );
dp[i][j] = max ( dp[i-1][j] , dp[i][j-1] );
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
#define MAX 1007
using namespace std;
int dp[MAX][MAX];
int main ( )
{
char s1[MAX] , s2[MAX];
while ( ~scanf ( "%s" , s1+1 ) )
{
scanf( "%s" , s2+1 );
int len1 = strlen ( s1+1 );
int len2 = strlen ( s2+1 );
memset ( dp , 0 , sizeof ( dp ) );
for ( int i = 1 ; i <= len1; i++ )
for ( int j = 1 ; j <= len2 ; j++ )
{
if ( s1[i] == s2[j] ) dp[i][j] = max ( dp[i-1][j-1] + 1 , dp[i][j] );
dp[i][j] = max ( dp[i][j] , max ( dp[i][j-1] , dp[i-1][j] ) );
}
printf ( "%d\n" , dp[len1][len2] ) ;
}
}