首页 > 代码库 > 8月26———动态规划lcs
8月26———动态规划lcs
解决最长公共子序列问题:
求解的方法如图所示:
例如,设所给的两个序列为X=<A,B,C,B,D,A,B>和Y=<B,D,C,A,B,A>。由算法LCS_LENGTH和LCS计算出的结果如下图所示:
其模板可以写成
View Codevoid lcss(){ int i,j; int sizex=str1.length(); int sizey=str2.length(); for(i=0;i<=sizex;i++) lcs[i][0]=0; for(i=0;i<=sizey;i++) lcs[0][i]=0; for(i=1;i<=sizex;i++) for(j=1;j<=sizey;j++) { if(str1[i-1]==str2[j-1]) lcs[i][j]=lcs[i-1][j-1]+1; else lcs[i][j]=lcs[i-1][j]>=lcs[i][j-1]?lcs[i-1][j]:lcs[i][j-1]; } cout<<lcs[sizex][sizey]<<endl; }也可以将数组进行压缩:
View Codememset(lcs,0,sizeof(lcs)); for(i=1;i<=n;i++) for(j=1;j<=n;j++) { if(str1[i-1]==str2[j-1]) lcs[i%2][j]=lcs[(i-1)%2][j-1]+1; else lcs[i%2][j]=lcs[(i-1)%2][j]>lcs[i%2][j-1]?lcs[(i-1)%2][j]:lcs[i%2][j-1]; } printf("%d\n",lcs[n%2][n]) ;
训练题目:
http://acm.hdu.edu.cn/diy/contest_show.php?cid=24575
8月26———动态规划lcs
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。