动态规划1--最长公共子序列

一、动态规划

经常会遇到复杂问题不能简单地分解成几个子问题,而会分解出一系列的子问题。简单地采用把大问题分解成子问题,并
综合子问题的解导出大问题的解的方法,问题求解耗时会按问题规模呈幂级数增加。

为了节约重复求相同子问题的时间,引入一个数组,不管它们是否对最终解有用,把所有子问题的解存于该数组中,这就
是动态规划法所采用的基本方法。

二、心得

递推公式的推导

递推公式的证明方法

代码的写法:把递推公式直接写进代码即可

三、题目

给出两个字符串,求出这样的一个最长的公共子序列的长度:子序列中的每个字符都能在两个原串中找到,而且每个字符的先后顺序和原串中的先后顺序一致。

Sample Input:样例输入

abcfbc abfcab

programming contest

abcd mnp

Sample Output:样例输出

4
2
0

四、分析

2、证明
S1[i-1]!= s2[j-1]时,MaxLen(S1,S2)不会比MaxLen(S1,S2j-1)
和MaxLen(S1i-1,S2)两者之中任何一个小,也不会比两者都大。
(1)不比任何一个小:MaxLen(S1,S2)字符串长于后两者
(2)也不会比两者都大:反证法,假设比两者都大:

若MaxLen(S1,S2)比MaxLen(S1,S2j-1)大,说明S2(j)这个字符与S1中的字符相等,并且S2(j)和这个相等的字符是最长公共子序列的最后一个。

若MaxLen(S1,S2)比MaxLen(S1i-1,S2)大,说明S1(i)这个字符与S2中的字符相等,并且S1(i)和这个相等的字符是最长公共子序列的最后一个。

上面两种情况都是最长公共子序列的最后一个,而这个最长公共子序列是MaxLen(S1,S2)的最长公共子序列,所以最后一个要相等。

那会得出S1[i]== s2[j]的结论,与假设冲突。

五、代码及结果

 1 /*
 2 最长公共子序列
 3 1、递推公式:
 4 (分最后一个相同和最后一个不同来分析)
 5 当i或j等于0,MaxLen(i,j)==0;
 6 当s1和s2的最后一个字符相同时,MaxLen(i,j)=MaxLen(i-1,j-1)+1;
 7 当s1和s2的最后一个字符不同时,MaxLen(i,j) = Max(MaxLen(i,j-1),MaxLen(i-1,j) );
 8 2、证明
 9 S1[i-1]!= s2[j-1]时,MaxLen(S1,S2)不会比MaxLen(S1,S2j-1)
10 和MaxLen(S1i-1,S2)两者之中任何一个小,也不会比两者都大。
11 (1)不比任何一个小:MaxLen(S1,S2)字符串长于后两者
12 (2)也不会比两者都大:反证法,假设比两者都大,那会得出S1[i-1]== s2[j-1]的结论,与假设冲突
13 3、代码
14 直接写递推公式就好了
15 */
16 /*
17 错误一:结果不对
18 for(j=1;j<=length2;j++),漏了等号,所以都没执行到这来,所以结果不对
19 */
20 #include <iostream>
21 #include <cstring>
22 using namespace std;
23 char sz1[1000];//字符数组1
24 char sz2[1000];//字符数组2
25 int maxLen[1000][1000];
26 //MaxLen(i,j)表示s1的左边i个字符形成的子串,
27 //与s2左边的j个字符形成的子串的最长公共子序列的长度(i,j从0开始算)
28 int main(){
29     freopen("in.txt","r",stdin);
30     while(cin>>sz1>>sz2){
31         int length1=strlen(sz1);//求字符数组1的长度
32         int length2=strlen(sz2);//求字符数组2的长度
33         int nTmp;
34         int i,j;
35         //初始化边界情况
36         for(i=0;i<=length1;i++)
37             maxLen[i][0]=0;
38         for(j=0;j<=length2;j++)
39             maxLen[0][j]=0;
40         //动态规划求解最长公共子序列
41         for(i=1;i<=length1;i++){
42             for(j=1;j<=length2;j++){
43                 if(sz1[i-1]==sz2[j-1]){//字符数组从0开始存数据的
44                     //当s1和s2的最后一个字符相同时,MaxLen(i,j)=MaxLen(i-1,j-1)+1;
45                     maxLen[i][j]=maxLen[i-1][j-1]+1;
46                 }
47                 else{
48                     //当s1和s2的最后一个字符不同时,MaxLen(i,j) = Max(MaxLen(i,j-1),MaxLen(i-1,j) );
49                      maxLen[i][j]=max(maxLen[i][j-1],maxLen[i-1][j]);
50                 }
51             }
52
53         }
54         /*
55         for(i=1;i<=length1;i++){
56             for(j=1;j<=length2;j++){
57                 cout<<maxLen[i][j]<<" ";
58             }
59             cout<<endl;
60         }
61         */
62         //cout<<length1<<" "<<length2<<endl;
63         cout<<maxLen[length1][length2]<<endl;
64     }
65     return 0;
66 } 

动态规划1--最长公共子序列相关推荐

  1. 动态规划解决最长公共子序列

    动态规划解决最长公共子序列 问题描述 给定两个序列,例如 X = "ABCBDAB".Y = "BDCABA",求它们的最长公共子序列的长度. 递归关系 c[i ...

  2. 动态规划解最长公共子序列(LCS)(附详细填表过程)

    目录 相关概念 子序列形式化定义: 公共子序列定义: 最长公共子序列(以下简称LCS): 方法 蛮力法求解最长公共子序列: 动态规划求解最长公共子序列: 分析规律: 做法: 伪代码: 下面演示下c数组 ...

  3. javascript写算法(一) 动态规划:最长公共子序列

    csdn是疯了吗,右下角的广告是一个人站在猪屁股后面打它...看了一下居然是baidu算出来的广告嵌在了iframe里,fixed to viewport,真是够了.最近还频频出现的广告是一个光头男子 ...

  4. 【动态规划】最长公共子序列与最长公共子串

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

  5. 动态规划解决方案最长公共子序列问题(开启)

     动态规划 常常会遇到复杂问题不能简单地分解成几个子问题,而会分解出一系列的子问题.简单地採用把大问题分解成子问题.并综合子问题的解导出大问题的解的方法,问题求解耗时会按问题规模呈幂级数添加. 为 ...

  6. 动态规划之----最长公共子序列

    动态规划算法的基本要素: 1)最优子结构 当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质.问题的最优子结构性质提供了该问题可用动态规划算法求解的最重要线索. 在动态规划算法中,利用 ...

  7. 两个字符串的最长公共子序列长度_【面试】动态规划-之最长公共子序列、最长公共子串问题...

    先来说明下什么是最长公共子序列,什么是是最长公共子串,举一个实际例子,myblogs与belong,最长公共子序列为blog(myblogs, belong),最长公共子串为lo(myblogs, b ...

  8. 实验二 动态规划算法 最长公共子序列问题

    基本题一:最长公共子序列问题 一.实验目的与要求 1.熟悉最长公共子序列问题的算法: 2.初步掌握动态规划算法: 二.实验题 若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,z ...

  9. 用动态规划解决最长公共子序列

    要求:最长公共子序列,英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S ...

  10. 【编程题 动态规划】最长公共子序列(详细注释 易懂)

    题目描述: 题目链接:最长公共子序列__牛客网 来源:牛客网 我们有两个字符串m和n,如果它们的子串a和b内容相同,则称a和b是m和n的公共子序列.子串中的字符不一定在原字符串中连续. 例如字符串&q ...

最新文章

  1. 我发现了个Python黑魔法,执行任意代码都会自动念上一段「平安经」
  2. 形象理解操作系统的进程与线程
  3. SDWebImage实现原理(怎么实现图片缓存器)
  4. 将SQL Server查询导出本地excel(mail发送)
  5. ubuntu 下 php 安装 zip
  6. 绝对布局优势_前瞻布局+尖端科技+雄厚资金 恒大解锁造车的“正确姿势”
  7. opencv中 .at<uchar>()和.ptr<uchar>()使用方法的区别
  8. 深度神经网络分布式训练指引
  9. 判断素数的方法(java)
  10. windows上比较好用的截图软件+Gif录制软件+看图软件,建议收藏!
  11. java实现时间轮定时器_基于侵入式链表的时间轮定时器实现
  12. 计算机环境变量怎么恢复默认,环境变量怎么还原
  13. Vue中axios的封装
  14. HTML中为什么点击按钮没有反应
  15. **Javase 重要知识点总结 day08
  16. 【JavaScript案例】js实现键盘敲击奏响音符
  17. 50条狗中有多少条病狗?
  18. STM32F407的USART
  19. 机器学习(周志华) 第十四章概率图模型
  20. 中国工业液压油市场市场发展现状研究与投资趋势分析报告2022-2028年

热门文章

  1. ios请求php接口失败,laravel,php_iOS调用Laravel接口返回错误信息,laravel,php,ios - phpStudy...
  2. Android最佳性能实践(一):合理管理内存
  3. nginx php unix负载,使用nginx配置多个php fastcgi负载均衡
  4. 递归python首尾相同的子字符串_推荐Python语言多层嵌套list的递归处理方法
  5. 出现“Could not resolve host: www.github.com; Unknown error”错误解决
  6. 现代操作系统: 第八章 多处理机系统
  7. 泛珠三角计算机作品大赛2018,2018年泛珠三角大学生计算机作品赛广西赛区选拔赛圆满结束...
  8. nginx 开启gzip 配置js_前端性能优化之缓存与GZIP
  9. python 装饰器实现事件绑定_Python装饰器是怎么实现的?
  10. ie浏览器修复_继IE之后,微软要彻底放弃它们了...