10405 Longest Common Subsequence

来源:互联网 发布:最佳适应算法例题 编辑:程序博客网 时间:2024/05/02 05:54
/*最长公共子序列问题,一次AC。简单题,找出状态转移即可题意:一串字母,求最长子序列字母个数(只需要字母先对顺序一样即可,不需要连在一起)思路:if(line[x1]==line[x2]) d(x1,x2)=d(x1+1,x2+1)+1;else d(x1,x2)=max(d(x1,x2+1),d(x1+1,x2));*///非递归实现#include <cstdio>#include <cstring>const int nMax=1010;int d[nMax][nMax];char line1[nMax],line2[nMax];int len1,len2;void init(){len1=strlen(line1);len2=strlen(line2);int i;memset(d,-1,sizeof(d));for(i=0;i<=len1;i++)d[i][len2]=0;for(i=0;i<=len2;i++)d[len1][i]=0;}int dp(int x1,int x2){int &temp=d[x1][x2];//①小技巧if(temp!=-1) return temp;if(line1[x1]==line2[x2])temp=dp(x1+1,x2+1)+1;else{temp=dp(x1+1,x2)>dp(x1,x2+1)?dp(x1+1,x2):dp(x1,x2+1);}return temp;}int main(){//freopen("f://data.in","r",stdin);while(gets(line1) && gets(line2)){init();printf("%d\n",dp(0,0));}return 0;}//非递归实现,由状态转移方程,从后向前搜索可实现。//#define TEST#include <cstdio>#include <cstring>const int nMax=1010;int d[nMax][nMax];char line1[nMax],line2[nMax];int len1,len2;void init(){len1=strlen(line1);len2=strlen(line2);int i;memset(d,-1,sizeof(d));for(i=0;i<=len1;i++)d[i][len2]=0;for(i=0;i<=len2;i++)d[len1][i]=0;}int max(int a,int b)//①,将int误写为了bool导致出错!{return a>b?a:b;}int main(){//freopen("f://data.in","r",stdin);while(gets(line1) && gets(line2)){init();for(int i=len1-1;i>=0;i--){for(int j=len2-1;j>=0;j--){if(line1[i]==line2[j]) d[i][j]=d[i+1][j+1]+1;elsed[i][j]=max(d[i+1][j],d[i][j+1]);#ifdefTESTprintf("%d ",d[i][j]);#endif}#ifdefTESTprintf("\n");#endif}printf("%d\n",d[0][0]);}return 0;}

原创粉丝点击