最长公共子序列
来源:互联网 发布:linux 删除匹配文件 编辑:程序博客网 时间:2024/06/06 13:08
问题描述:
给出两个序列Xn和Ym。求出两序列的最长公共子序列。(子序列:下表递增的序列)。
分析:
#include <iostream>using namespace std;const int MAXN = 1005;int S[MAXN][MAXN],L[MAXN][MAXN];char x[MAXN],y[MAXN],z[MAXN];int CommonOrder(char x[],int n,char y[],int m,char z[]);int main(){ int n,m,i; cin>>n; for(i=1;i<=n;i++) cin>>x[i]; cin>>m; for(i=1;i<=m;i++) cin>>y[i]; cout<<"最长公共子序列"<<endl; cout<<"长度为:"<<CommonOrder(x,n,y,m,z)<<endl; return 0;}int CommonOrder(char x[],int n,char y[],int m,char z[]){ int i,j,k; for(i=0;i<=n;i++) L[i][0]=0; for(i=0;i<=m;i++) L[0][i]=0; for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { if(x[i] == y[j]) { L[i][j]=L[i-1][j-1]+1; S[i][j]=1; } else if(L[i][j-1]>L[i-1][j]) { L[i][j]=L[i][j-1]; S[i][j]=2; } else { L[i][j]=L[i-1][j]; S[i][j]=3; } } } i=n;j=m;k=L[n][m]; while(i>0 && j>0) { if(S[i][j]==1) { z[k--]=x[i]; i--; j--; } else if(S[i][j]==2) j--; else i--; } for(k=1;k<=L[n][m];k++) cout<<z[k]<<" "; cout<<endl; return L[n][m];}
数据:
输入:
6
a b c b d b
9
a c b b a b d b b
输出:
最长公共子序列:
a b b d b
长度为:5
该算法当有多解时,只是输出了其中的一个解!!!(当输入为上面的时候,其实a c b d b也是最长公共子序列)
1 0
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列...
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 三月小结 -- 2016/3/29
- 【scrapy】模拟登陆知乎
- Eclipse中jsp、js文件编辑时,卡死现象解决汇总
- Git学习手册
- SEAndroid安全机制框架分析
- 最长公共子序列
- 希尔排序
- js 正则表达式之test函数讲解
- [NOIP2013]积木大赛
- 提高mysql千万级大数据SQL查询优化30条经验(Mysql索引优化注意)
- 贪心1005
- Android布局的高按照比例来分布
- 【USACO题库】1.2.4 Palindromic Squares回文平方数
- 文件保存