http://blog.csdn.net/a_eagle/article/details/7213236
公共序列可以用一个二维数组dp[i][j]保存每个点时的最大数字,本质就是一个双向比较。
dp[i][j] = dp[i-1][j-1]+1;(a[i]==b[j])
dp[i][j] = max(dp[i][j-1],dp[i-1][j]);(a[i]!=b[j])
处理字符串时可以用sf("%s",a+1)来将字符串从1开始保存,这时strlen()也要用a+1
#include <iostream> #include <string> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath> #include <algorithm> #include <stack> using namespace std; #define mem(a,b) memset(a,b,sizeof(a)) #define pf printf #define sf scanf #define debug printf("! ") #define INF 10000 #define MAX(a,b) a>b?a:b #define blank pf(" ") #define LL long long int n,m,V; int dp[1010][1010],map[1010][1010]; char a[1010],b[1010]; int main() { int i,j,t; while(~sf("%s%s",a+1,b+1)) { mem(dp,0); mem(map,0); n = strlen(a+1); m = strlen(b+1); for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { if(a[i]==b[j]) { dp[i][j] = dp[i-1][j-1]+1; } else { dp[i][j] = max(dp[i-1][j],dp[i][j-1]); } } } pf("%d ",dp[n][m]); } }