最长公共子序列
来源:互联网 发布:剑三萝莉具体数据 编辑:程序博客网 时间:2024/05/01 00:15
所有的公共最长上升序列有三种解法:
(1)枚举法
(2)递归
(1)枚举法
(2)递归
(3)动态规划
枚举法:
就是枚举较短串中的所有子串z^n,然后直接进行字符串匹配。总之,慢死你。
递归,动态规划都是一样的方程
如果要输出路径,那很明显是在对角线移动的时候那个位置就是路径。
只需要用一个数组记录下当前位置是从之前的哪个位置转移过来的即可。
如果是从上面或者左边过来的,那就不用输出,如果是对角线来的话,那就输出呗!
#include<stdio.h>#include<string.h>int dp[1000][1000];int max(int a,int b){ return a=a>b?a:b;}void prit(int b[][100],char *x,int i,int j){if(i==0||j==0) return ;if(b[i][j]==0){prit(b,x,i-1,j-1);printf("%c",x[i]);}else if(b[i][j]==1){prit(b,x,i-1,j);}else prit(b,x,i,j-1);}int main(){ char s1[1000],s2[1000];int b[100][100]; while(scanf("%s%s",s1+1,s2+1)!=EOF) { memset(dp,0,sizeof(dp)); int i=0; int j=0; for(i=1;s1[i]!='\0';i++){for(j=1;s2[j]!='\0';j++) { if(s1[i]==s2[j]) { dp[i][j]=dp[i-1][j-1]+1;b[i][j]=0; } else if(dp[i-1][j]>dp[i][j-1]) { dp[i][j]=dp[i-1][j];b[i][j]=1; }else{dp[i][j]=dp[i][j-1];b[i][j]=-1;} } } printf("%d\n",dp[i-1][j-1]);prit(b,s1,i-1,j-1);printf("\n"); }}
0 3
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列...
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- java 反射
- JS正则表达式获取字符串中得特定字符
- 随笔吐槽
- win7(win8)下硬盘安装redhat企业版v6双系统
- 简单的通讯薄
- 最长公共子序列
- mac ssh key 的获取
- 网页按钮
- cocos2dx android平台 解决iconv库的移植问题
- 点击按钮
- MFC中处理更新命令UI消息控制函数的调用
- Asterisk上安装lua模块
- JavaSE0010_方法重载与重写
- 复杂按钮(父按钮)