/*
输入:两个字符串
输出:最长公共子序列
算法思想:动态规划
*/
#include <iostream>
#include <cstring>
using namespace std;
string x,y; //输入串
int c[100][100]; //维护LCS_length的数组
int b[100][100]; //用于构造一个最优解
int lcs_len(string x,string y)
{
int m,n,i,j;
m=x.length();
n=y.length();
for(i=0;i<=m;i++)
c[i][0]=0;
for(j=1;j<=n;j++)
c[0][j]=0;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{
if(x[i-1]==y[j-1]) {c[i][j]=c[i-1][j-1]+1;b[i][j]=0;} //string x 有一个字符的偏移,0表示↖
else if(c[i-1][j]>=c[i][j-1]) {c[i][j]=c[i-1][j];b[i][j]=1;} //1表示↑
else {c[i][j]=c[i][j-1];b[i][j]=-1;} //-1表示←
}
return c[m][n];
}
void print_lcs(string x,int b[][100],int i,int j) //构造一个最优解
{
if(i==0 || j==0) return;
if(b[i][j]==0)
{
print_lcs(x,b,i-1,j-1);
cout <<x[i-1]; //string x 有一个字符的偏移
}
else if(b[i][j]==1)
print_lcs(x,b,i-1,j);
else
print_lcs(x,b,i,j-1);
}
int main()
{
int i,j,m,n;
cin >>x;
cin >>y;
m=x.length();
n=y.length();
cout <<lcs_len(x,y) <<endl;
print_lcs(x,b,m,n);
cout <<endl;
for(j=1;j<=n;j++)
cout <<" \t" <<y[j-1];
cout <<endl;
for(i=1;i<=m;i++)
{
cout <<x[i-1] <<"\t";
for(j=1;j<=n;j++)
cout <<c[i][j] <<"\t";
cout <<endl;
}
cout <<endl;
for(j=0;j<n;j++)
cout <<" \t" <<y[j];
cout <<endl;
for(i=1;i<=m;i++)
{
cout <<x[i-1] <<"\t"; //string x 有一个字符的偏移
for(j=1;j<=n;j++)
cout <<b[i][j] <<"\t";
cout <<endl;
}
cout <<endl;
return 0;
}
LCS的动态规划算法
最新推荐文章于 2025-04-01 07:00:00 发布