问题描述

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

abcfbc abfcab
programming contest
abcd mnp

样例输出

4
2
0

算法思想

输入两个串s1,s2,设MaxLen(I,j)表示:
s1左边的第i个字符形成的子串,与s2左边的j个字符形成的子串的最长公共子序列的长度(i,j从0开始算)

MaxLen(i,j)就是本题的状态。
假定len1=strlen(s1),len2=strlen(s2)
那么题目就是要求MaxLen(len1,len2)
显然:
MaxLen(n,0)=0(n=0…len1)
MaxLen(0,n)=0(n=0…len2)

递推公式:
if(s1[i-1]==s2[j-1]) //s1的最左边字符时s1[0]
MaxLen(i,j)= MaxLen(i-1,j-1)+1

(s1的左边形成的i个字符和s2的左边j个字符所形成的最长公共子序列的长度等于s1左边的i-1个字符和s2左边的j-1个字符所形成的最长公共子序列的长度+1)
else
MaxLen(i,j)=Max(MaxLen(i,j-1), MaxLen(i-1,j))

(s1左边的i个字符和s2的左边j-1个字符,s1左边的i-1个字符和s2左边的j个字符所形成的公共子序列的长度的最大值)
时间复杂度O(mn)m,n是两个子串长度

s1[i-1]!=s2[j-1],maxlen(s1,s2)不会比maxlen(s1,s2j-1)和maxlen(s1i-1,s2)两者汇总的任何一个小,也不会比两者都大。
前者,显然成立。
对于后者,反证法,假设maxlen(s1,s2)比maxlen(s1,s2j-1)大,它们的差别在于前者比后者多了一个字符,多出来的字符时s2[j-1],说明s2[j-1]要起作用,说明它是属于他们的最长公共子序列,maxlen(s1,s2)比maxlen(s1i-1,s2)大,同理,s1[i-1]起作用,它必然是s1和s2所形成的最长公共子序列的字符,所以s1[i-1]和s2[j-1]均是s1和s2最长公共子序列的最后一个字符。与前提矛盾,说明前面的假设不成立,
则s1[i-1]!=s2[j-1],maxlen(s1,s2)不会比maxlen(s1,s2j-1)和maxlen(s1i-1,s2)两者汇总的任何一个小,也不会比两者都大。

程序代码

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXSIZE 100
char a[MAXSIZE];
char b[MAXSIZE];
int maxLen[MAXSIZE][MAXSIZE];
int commonStr(char a [ ],char b [ ]){//计算两个字符串的长度 int len_a=strlen(a);int len_b=strlen(b);int i,j;//设置边界条件for(i=0;i<=len_b;i++){maxLen[len_a][0]=0;}for(i=0;i<=len_a;i++){maxLen[0][len_b]=0;}for(i=0;i<len_a;i++){for(j=0;j<len_b;j++){//当a[i]等于b[j] //s1的左边形成的i个字符和s2的左边j个字符所形成的最长公共子序列的长度等于//s1左边的i-1个字符和s2左边的j-1个字符所形成的最长公共子序列的长度+1 if(a[i]==b[j]){maxLen[i+1][j+1]=maxLen[i][j]+1;}else{//当a[i]不等于b[j]时 //s1左边的i个字符和s2的左边j-1个字符,s1左边的i-1个字符和s2左边的j个字符所形成的公共子序列的长度的最大值maxLen[i+1][j+1]=max(maxLen[i][j+1],maxLen[i+1][j]);}}} return maxLen[len_a][len_b];
}
int main(){int *res=new int[MAXSIZE];int num=0;while(cin>>a>>b){res[num++]=commonStr(a,b);}for(int i=0;i<num;i++){cout<<res[i]<<endl;}return 0;
}

程序设计与算法----动态规划之最长上升子序列相关推荐

  1. 程序设计与算法----动态规划之最长公共子序列

    问题描述 一个数的序列ai,当a1<a2<-<as的时候,我们称这个序列是上升的.对于给定的一个序列(a1,a2,-.an)我们可以得到一个上升的子序列(ai1,ai2,-,aik) ...

  2. 动态规划法求最大字段和时间复杂度_九章算法 | 动态规划:最长上升子序列

    给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度. 在线评测地址:LintCode 领扣 说明 最长上升子序列的定义: 最长上升子序列问题是在一个无序的给定序列中找到一个尽可能长的由低 ...

  3. 算法知识之最长公共子序列问题(动态规划)

    最近朋友让帮做个关于动态规划的最长公共子序列的问题,翻看以前的笔记并完成该题后,顺便写这样一篇文章,希望对大家有所帮助,同时也帮助自己回顾该知识点. 一.最长公共子序列的定义 子序列:若给定序列X={ ...

  4. 最长公共子序列算法 java_转【算法之动态规划(三)】动态规划算法之:最长公共子序列 最长公共子串(LCS)字符串相似度算法...

    1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 2.最长公共子串 其实这是一个序贯决策问题 ...

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

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

  6. 算法设计 - LCS 最长公共子序列最长公共子串 LIS 最长递增子序列

    出处 http://segmentfault.com/blog/exploring/ 本章讲解: 1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度: 2. 与之类似但不 ...

  7. c语言最长递增子序列nlogn,十月常见算法考题、最长递增子序列,Leetcode第300题最长上升子...

    十月常见算法考题.最长递增子序列,Leetcode第300题最长上升子 十月常见算法考题.最长递增子序列,Leetcode第300题最长上升子序列的变种,我没见过乔丹,今天詹姆斯就是我的神! @Aut ...

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

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

  9. C++动态规划之最长上升子序列

    1 子序列与上升子序列 1.1 子序列 一个序列A={a1,a2,...an}中任意删除若干项,剩余的序列叫做A的一个子序列.例如序列A={1,3,5,4,2},删除其中的第3项和第5项,得到序列B= ...

最新文章

  1. mybatis 复习笔记02
  2. MTM:matlab实现4主函数
  3. thinkPHP 空模块和空操作、前置操作和后置操作 具体介绍(十四)
  4. 51nod1325-两棵树的问题【最大权闭合图,网络流】
  5. RemoveError: ‘setuptools‘ is a dependency of conda
  6. JavaScript数据结构——栈(Stack)
  7. vim 使用 Tricks
  8. HDOJ--2112--HDU Today
  9. dhcp 续约review报文_DHCP工作原理( DHCP地址续约和释放)
  10. intel 集显 linux 驱动程序,Linux下Intel集成显卡驱动安装
  11. 2019最新《web前端课程+项目实践课程》高清无拼凑
  12. Dell PowerEdge RAID控制器存在一个潜在问题
  13. flink(三):数据处理Transformation
  14. 温莎大学的计算机科学,温莎大学荣誉计算机科学专业本科.pdf
  15. 【高效程序员系列】3 别碰鼠标——让键盘飞起来
  16. Web项目之服务器、客户端存储
  17. 入门级蓝牙遥控小车制作教程
  18. [附源码]Python计算机毕业设计SSM基于的影评系统(程序+LW)
  19. 使用numpy计算准确率
  20. Java常见的线程安全工具容器类(待完善)

热门文章

  1. 马化腾:5G技术可以影响甚至重构整个互联网服务形态
  2. 李彦宏卸任百度投资管理有限公司董事 马东敏上任
  3. 小米手机将终结卡顿?未来所有机型将升级新MIUI
  4. 拳王虚拟项目公社:说一个合法正规兼职创业,副业虚拟资源项目
  5. php文件上传sha1,PHP中sha1_file与md5_file哪个更快?
  6. Linux内核小笔记:spin_lock锁内不能使用sleep休眠
  7. 【算法】八大排序算法的时间复杂度 表格
  8. 【es】Elasticsearch:inverted index,doc_values及source
  9. 【Java】Java 反射 object is not an instance of declaring class
  10. 【Flink】FlinkException The file LOG does not exist on the TaskExecutor