#include<iostream>
using namespace std;
//该函数输出位置矩阵,返回最长长度
int LCS(char s1[],int m,char s2[],int n,int **&results)
{
int **c=(int**)malloc(sizeof(int*)*(m+1));
int **result=(int**)malloc(sizeof(int*)*(m+1));//记录加入字符的位置信息,1表示由当前中的c值是有c值上一个值得来的,
//-1表示由坐标得来的,0 表示由斜对角得来的
for(int i=0;i<=m;i++)
{
c[i]=(int*)malloc(sizeof(int)*(n+1));
result[i]=(int*)malloc(sizeof(int)*(n+1));
}
for(int i=0;i<=m;i++)
c[i][0]=0;
for(int j=0;j<=n;j++)
c[0][j]=0;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(s1[i-1]==s2[j-1])//注意这里s1和s2的 下标从0 开始,所以减去1
{
c[i][j]=c[i-1][j-1]+1;
result[i][j]=0;
}
else
{
if(c[i-1][j]>=c[i][j-1])
{
c[i][j]=c[i-1][j];
result[i][j]=1;
}
else if(c[i-1][j]<c[i][j-1])
{
c[i][j]=c[i][j-1];
result[i][j]=-1;
}
}
}
}
cout<<"输出的最大长度矩阵为:"<<endl;
for(int i=0;i<=m;i++)
{
for(int j=0;j<=n;j++)
{
cout<<c[i][j]<<" ";
}
cout<<endl;
}
cout<<"输出位置矩阵"<<endl;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
cout<<result[i][j]<<" ";
}
cout<<endl;
}
results=result;
return c[m][n];
}
//该函数处理位置矩阵,得到字符串
char *lcs(int **b,int m,int n,char *s)
{
int k=0;
char *result=(char*)malloc(sizeof(char)*(m+1));
while(m>=1&&n>=1)
{
if(b[m][n]==1)
{
m--;
}
else if(b[m][n]==-1)
{
n--;
}
else if(b[m][n]==0)
{
m--;
n--;
result[k++]=s[m];
}
}
result[k]='\0';
//翻转
for(int i=0;i<k/2;i++)
{
swap(result[i],result[k-i-1]);
}
return result;
}
void main()
{
char *s1="ABCBDAB";
char *s2="BDCABA";
int **b;//存放位置矩阵
char *result;//存放最长公共子序列
int l1=strlen(s1);
int l2=strlen(s2);
int maxLen=LCS(s1,l1,s2,l2,b);
cout<<"得到的最长公共子序列长度为为:"<<maxLen<<endl;
result=lcs(b,l1,l2,s1);
cout<<"得到的最长公共子序列为:"<<endl;
int i=0;
while(result[i]!='\0')
cout<<result[i++]<<" ";
cout<<endl;
system("pause");
}
动态规划三部曲之解决最长公共子序列问题(三)
最新推荐文章于 2024-08-15 18:41:31 发布