动态规划三部曲之解决最长公共子序列问题(三)

来源:互联网 发布:unity3d粒子系统水流 编辑:程序博客网 时间:2024/05/16 12:39
#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");}

0 0
原创粉丝点击