zoj 1733 最长公共子序 经典动态规划
题目地址: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1733
初始化时,需要计算所有的f[0][i] 和 f[i][0] , 状态转方程是 f[i][j]= if (a[i]==b[j] ) f[i-1][j-1]+1 else max(f[i-1][j],f[i][j-1]) 数组开大一点· 【100】【100】 是错了的
代码:
#include <iostream> #include<string> using namespace std; int f[1000][1000]; int max(int a,int b) { if(a>b) return a; else return b; } int main() { string a,b; while(cin>>a>>b) { int lengtha=a.length(); int lengthb=b.length(); for(int i=0;i<lengtha;i++) { int tag=0; for(int j=0;j<=i;j++) if(b[0]==a[j]) { tag=1; break; } if(tag==1) f[i][0]=1; else f[i][0]=0; } for(int i=0;i<lengthb;i++) { int tag=0; for(int j=0;j<=i;j++) if(a[0]==b[j]) { tag=1; break; } if(tag==1) f[0][i]=1; else f[0][i]=0; } for(int i=1;i<lengtha;i++) for(int j=1;j<lengthb;j++) { if(a[i]==b[j]) f[i][j]=f[i-1][j-1]+1; else f[i][j]=max(f[i-1][j],f[i][j-1]); } cout<<f[lengtha-1][lengthb-1]<<endl; } }