HDU 1159 最长公共子序列问题
详见杭电刘春英老师PPT
//DP算法: //用f[i][j] 表示字符串a的第i个字母与字符串b的第j个字母比较,得到两串相比时第i和第j个字母之前相同字母的个数 // 如果a[i-1]==b[j-1], f(i,j)= f(i-1,j-1)+1;否则,f(i,j)=max(f(i,j-1),f(i-1,j)); #include<iostream> #include<string> using namespace std; int main() { int f[500][500]; char a[500],b[500]; int i,j,lena,lenb; while(scanf("%s%s",a,b)!=EOF) { lena=strlen(a); lenb=strlen(b); for(i=0;i<lena;i++) f[0][i]=0; //字符串a没有字符时,b与a比较的结果都是0 for(i=0;i<lenb;i++) f[i][0]=0; //字符串b没有字符时,a与b比较的结果都是0 for(i=1;i<=lena;i++) { for(j=1;j<=lenb;j++) { if(a[i-1]==b[j-1]) { f[i][j]=f[i-1][j-1]+1; } else { if(f[i][j-1]>f[i-1][j]) f[i][j]=f[i][j-1]; else f[i][j]=f[i-1][j]; } } } printf("%d/n",f[lena][lenb]); } return 0; }