动态规划 最长公共子序列
来源:互联网 发布:江苏国税普通发票软件 编辑:程序博客网 时间:2024/06/09 14:36
问题:
什么是最长公共子序列呢?好比一个数列S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则S称为已知序列的最长公共子序列。
举个例子,如:有两条随机序列,如 1 3 4 5 5 ,2 4 5 5 7 6,则它们的最长公共子序列便是:4 5 5。
分析:
最长公共子序列的结构
最长公共子序列的结构有如下表示:
设序列X = < x1, x2, …, xm>和Y = < y1, y2, …, yn>的一个最长公共子序列Z = < z1, z2, …, zk>,则:- 若xm = yn,则zk=xm=yn且Zk-1是Xm-1和Yn-1的最长公共子序列;
- 若xm ≠ yn且zk ≠ xm ,则Z是Xm-1和Y的最长公共子序列;
- 若xm ≠ yn且zk ≠ yn ,则Z是X和Yn-1的最长公共子序列。
其中Xm-1=< x1, x2, …, xm-1>,Yn-1=< y1, y2, …, yn-1>,Zk-1=< z1, z2, …, zk-1>。
子问题的递归结构
由最长公共子序列问题的最优子结构性质可知,要找出X=< x1, x2, …, xm>和Y=< y1, y2, …, yn>的最长公共子序列,可按以下方式递归地进行:- 当xm=yn时,找出Xm-1和Yn-1的最长公共子序列,然后在其尾部加上xm(=yn)即可得X和Y的一个最长公共子序列。
- 当xm≠yn时,必须解两个子问题,即找出Xm-1和Y的一个最长公共子序列及X和Yn-1的一个最长公共子序列。这两个公共子序列中较长者即为X和Y的一个最长公共子序列。
由此递归结构容易看到最长公共子序列问题具有子问题重叠性质。例如,在计算X和Y的最长公共子序列时,可能要计算出X和Yn-1及Xm-1和Y的最长公共子序列。而这两个子问题都包含一个公共子问题,即计算Xm-1和Yn-1的最长公共子序列。
与矩阵连乘积最优计算次序问题类似,我们来建立子问题的最优值的递归关系。用c[i,j]记录序列Xi和Yj的最长公共子序列的长度。其中Xi=< x1, x2, …, xi>,Yj=< y1, y2, …, yj>。当i=0或j=0时,空序列是Xi和Yj的最长公共子序列,故c[i,j]=0。其他情况下,由定理可建立递归关系。
求解:
#include <cstdio> #include <iostream> #include <algorithm> #include <string> using namespace std; int main() { string str1,str2; int dp[200][200]; while(cin>>str1>>str2) { memset(dp,0,sizeof(dp)); int la = str1.length(); int lb = str2.length(); for(int i = 1; i <= la; i++) for(int j = 1; j <= lb; j++) { if(str1[i - 1] == str2[j - 1]) { dp[i][j] = dp[i-1][j-1]+1; } else dp[i][j] = max(dp[i-1][j],dp[i][j-1]); } cout<<dp[la][lb]<<endl; } return 0; }
转自:http://blog.csdn.net/u013445530/article/details/45645307
- 最长公共子序列&&最长公共子串---[动态规划]
- 动态规划-最长公共子序列、最长公共子串
- 动态规划之最长公共子序列
- 动态规划 ------- 最长公共子序列
- 动态规划实现最长公共子序列
- 【动态规划】最长公共子序列LCS
- 动态规划--最长公共子序列
- 动态规划:最长公共子序列
- 动态规划解决最长公共子序列
- 最长公共子序列-动态规划DP
- 动态规划--最长公共子序列
- 最长公共子序列(动态规划)
- 动态规划解决最长公共子序列
- 最长公共子序列(动态规划)
- 动态规划 最长公共子序列
- 动态规划 - 最长公共子序列
- 动态规划之最长公共子序列
- 最长公共子序列 [动态规划]
- MFC创建并运行批处理失败问题
- 大学期末考试SSM试题三
- 网络流 最小路径覆盖 二分图最大匹配
- Groovy初步了解
- php7环境下ThinkPHP报错:Cannot use 'String' as class name as it is reserved
- 动态规划 最长公共子序列
- CSS Mastery摘要(1)--Getting Your Styles to Hit the Target
- leetcode Perfect Number 完全数
- 一种别样的打印Log的方式
- Ubuntu下SVN服务的搭建(apache2+svn)
- IO-01-字节流与字符流
- loadrunner的学习
- 【密码学】C语言实现AES核心步骤
- LeetCode-矩阵旋转