/*
* problem: 最长公共子序列
* method: 动态规划
* date: 2020/04/28
*/
#include<iostream>
using namespace std;
const int N=20;
char x[N];//序列x
char y[N];//序列y
int L[N+1][N+1];//最长公共子序列长度表
int S[N+1][N+1];//状态矩阵
char z[N];//最大子序列
void CommonOrder(int nx,int ny) {
int i,j,k;
for(i=0; i<nx; i++) L[i][0]=0;
for(j=0; j<ny; j++) L[0][j]=0;
for(i=1; i<=nx; i++) {
for(j=1; j<=ny; j++) {
if(x[i-1]==y[j-1]) {
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;
}
}
}
for(i=nx,j=ny,k=L[i][j]-1; i>0&&j>0;) {
if(S[i][j]==1){
z[k]=x[i-1];
k--;i--;j--;
}else if(S[i][j]==2) j--;
else i--;
}
}
int main() {
int i,j,nx,ny;
cout<<"请输入序列x、y的长度:";
cin>>nx>>ny;
cout<<"请输入序列x:";
for(i=0; i<nx; i++) cin>>x[i];
cout<<"请输入序列y:";
for(i=0; i<ny; i++) cin>>y[i];
CommonOrder(nx,ny);
cout<<"最大公共子序列为:";
for(i=0; i<L[nx][ny]; i++)
cout<<z[i];
cout<<"\n最长公共子序列的长度为:"<<L[nx][ny]<<endl;
for(i=0; i<=nx; i++) {
for(j=0; j<=ny; j++) {
cout.width(4);
cout<<L[i][j];
}
cout<<endl;
}
cout<<"状态矩阵S:"<<endl;
for(i=0;i<=nx;i++){
for(j=0;j<=ny;j++){
cout.width(4);
cout<<S[i][j];
}
cout<<endl;
}
return 0;
}
/*
测试数据:
6 9
abcbdb
acbbabdbb
*/
动态规划——最长公共子序列
最新推荐文章于 2021-11-14 20:54:52 发布