动态规划三部曲之解决最长公共子序列问题(三)
2015-06-30 17:18
543 查看
#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] ; } //该函数处理位置矩阵,得到字符串 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] ==1) { m--; } else if(b[m] ==-1) { n--; } else if(b[m] ==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"); }
相关文章推荐
- C++伪函数
- php5.3 安装xdebug2.1.2
- Android-ActionBar-invalidateOptionsMenu()
- 请关闭你的等死模式
- Vim简易教程
- 将真分数化为埃及分数:
- 虽然风格
- JavaScript权威指南_114_第15章_脚本化文档_15.2-选取文档元素-通过name选取元素
- 汉诺塔作业
- Python Django 开发 4 ORM
- 黑马程序员---异常总结
- 谷歌发布照片应用Google Photos
- VBoxManage命令用法详解
- mybatis与spring整合
- 【hadoop】13、hadoop2.5搭建集群
- 手机触屏的触发事件
- XML
- C++赋值运算符与赋值表达式
- 做一个有趣的有意思的人
- CentOS下的JDK安装(.tar.gz文件)