hdu1159 题目要求两个字符串最长公共子序列,
状态转换方程 f[i][j]=f[i-1][j-1]+1; a[i]=b[j]时
f[i][j]=MAX{f[i-1][j],f[i][j-1]} a[i]!=b[j]时
f[i][j]记录a字符串 i 前子串 与 b字符串 j 前子串最长公共子序列 初始化后,自底向上,逐步求解
动态规划的思想没有搞清楚,递归超时。。犯了很低级的错误
动态规划尽可能地减少重复运算,记忆化搜索很关键
正确代码:
#include<iostream> #include<string> #define MAX(a,b) ((a)>(b)?(a):(b)) using namespace std; char a[1001],b[1001]; int f[1000][1000]; int re; int main() { int lena, lenb,i,j,re; while(scanf("%s%s", a,b)!=EOF) { lena=strlen(a); lenb=strlen(b); for(i=0; i<=lena; i++) f[i][0]=0; for(j=0; j<=lenb; j++) f[0][j]=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 f[i][j]=MAX(f[i-1][j],f[i][j-1]); cout<<f[lena][lenb]<<endl; }return 0; }
递归超时代码贴在这里,给自己警示一下!!!!!!
#include<iostream> #include<string> #define MAX(a,b) ((a)>(b)?(a):(b)) using namespace std; string a,b; int final(int la, int lb, int re) { if(la<0 || lb<0)return re; if(a[la]==b[lb]) re=final(la-1,lb-1,re+1); else re=MAX(final(la-1,lb,re),final(la,lb-1,re)); return re; } int main() { int lena, lenb; while(cin >> a >> b) { lena=a.length(); lenb= b.length(); cout<<final(lena-1,lenb-1,0)<<endl; }return 0; }
先前wa了的代码,求测试数据,顺便贴过来,回来有空再回来瞅瞅。。现在有点乱了
#include<iostream> #include<string> #define find(c,n) find_first_of(c,n) #define MAX(a,b) ((a)>(b)?(a):(b)) using namespace std; int d[10000]; int re[10000]; int main() { string a,b; int i,j,k,p,len,max,num[27]; while(cin >> a >> b) { //cin >> a >> b; memset(d,0,sizeof(d)); memset(re,0,sizeof(re)); memset(num,0,sizeof(num)); len = b.length(); for (i=0; i<len; i++) //cout <<a.find_first_of(b[i],0)<<endl; { k=b[i]-'a'; p=a.find(b[i],num[k]); if(p==string::npos) d[i]=-1; else d[i]=p,num[k]=p+1; } //for(i=0;i<len; i++)cout << d[i] << " ";cout <<endl; for(i=0;i<len; i++)if(d[i!=-1])re[i]=1; for(i=0; i<len; i++ ) { if(d[i]==0){re[i]=1;continue;}; int f=0; for(j=i-1;j>=0 ;j--) if(d[i]>d[j])re[i]=MAX(re[i],re[j]+1),f=1; if(!f)re[i]=0; } //for(i=0;i<len; i++)cout << re[i] << " ";cout <<endl; max=re[0]; for(i=1; i<len; i++) max=MAX(max,re[i]); cout << max << endl; }return 0; }