用动态规划联系递推公式来解决问题:
来实战吧:
hdu 1159 Common Subsequence
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1159
#include <iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=505; int C[maxn][maxn],B[maxn][maxn]; char s1[maxn],s2[maxn]; int Lcslength(){ memset(C,0,sizeof(C)); memset(B,0,sizeof(B)); int i,j,length1=strlen(s1+1),length2=strlen(s2+1); for(i=1;i<=length1;i++){ for(j=1;j<=length2;j++){ if(s1[i]==s2[j]){ C[i][j]=C[i-1][j-1]+1; B[i][j]=1; //指向左上方 } else if(C[i-1][j]>=C[i][j-1]){ C[i][j]=C[i-1][j]; B[i][j]=2; //指向上面 } else { C[i][j]=C[i][j-1]; B[i][j]=0; //指向左边 } } } return C[length1][length2]; } int main() { //freopen("cin.txt","r",stdin); int i,j; while(scanf("%s%s",s1+1,s2+1)>0){ printf("%d\n",Lcslength()); memset(s1,0,sizeof(s1)); memset(s2,0,sizeof(s2)); } return 0; }
#include <iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=505; int C[maxn][maxn]; char s1[maxn],s2[maxn]; int Lcslength(){ memset(C,0,sizeof(C)); int i,j,length1=strlen(s1+1),length2=strlen(s2+1); for(i=1;i<=length1;i++){ for(j=1;j<=length2;j++){ if(s1[i]==s2[j]) C[i][j]=C[i-1][j-1]+1; else if(C[i-1][j]>C[i][j-1]) C[i][j]=C[i-1][j]; else C[i][j]=C[i][j-1]; } } return C[length1][length2]; } int main() { //freopen("cin.txt","r",stdin); int i,j; while(scanf("%s%s",s1+1,s2+1)>0){ // '>0'要写上哦 printf("%d\n",Lcslength()); memset(s1,0,sizeof(s1)); memset(s2,0,sizeof(s2)); } return 0; }