程序设计与算法----动态规划之最长公共子序列
问题描述
一个数的序列ai,当a1<a2<…<as的时候,我们称这个序列是上升的。对于给定的一个序列(a1,a2,….an)我们可以得到一个上升的子序列(ai1,ai2,…,aik),这里1<=i1<i2<…ik<=N。比如,对于序列(1,7,3,5,9,4,8),有它的一些上升子序列,如(1,7),(3,4,8)等等,这些子序列中最长的长度是4,比如子序列(1,3,5,8)
你的任务,就是对于给定的序列,求出最长上升子序列的长度。
输入数据
输入的第一行是序列的长度N(1<=N<=1000),第二行给出序列中的N个整数,这些整数的取值范围都在0到10000
输出要求
最长上升子序列的长度
输入样例
7
1 7 3 5 9 4 8
输出样例
4
算法思想
1.求子问题
求序列的前n个元素的最长上升子序列的长度是个子问题,但是这样分解子问题,不具有无后效性
假设F(n)=x,但可能有多个序列满足F(n)=x。有的序列最后一个元素比an+1小,则加上n+1就能形成更长的上升子序列,有的序列最后一个元素不比an+1小…以后的事情受如何达到状态n的思想,不符合无后效性
求以ak(k=1,2,3,…N)为终点的最长上升子序列的长度
一个上升子序列中最右边的那个数,称为该子序列的重点
虽然这个子问题和原问题形式上并不完全一样,但是只要这个N个子问题都解决了,那么这N个子问题的解中,最大的那个就是整个问题的解。
2.确定状态
子问题只和一个变量—数字的位置相关,因此序列中位置k就是状态,而状态k对应的值,就是以ak作为终点的最长上升子序列的长度
状态一共有n个
3.找出状态转移方程
maxLen(k)表示以ak作为终点的最长上升子序列的长度,那么
初始状态maxLen(1)=1
maxLen(k)=max{maxLen(i):1<=i<k且ai<ak且k≠1}+1,若找不到这样的i,则maxLen(k)=1
maxLen(k)的值,就是在ak左边,终点数值小于ak,且长度最大的那个上升子序列的长度再加1.因为ak左边任何终点小于ak的子序列,加上ak之后就能形成一个更长的上升子序列。
程序代码
#include<iostream>
#define MAXSIZE 1000
using namespace std;
//时间复杂度为O(n2)
int ascendList(int a[],int n){//maxLen[k]表示以ak为终点的最长上升子序列的长度 int maxLen[MAXSIZE]; //这里为了方便,就所有元素的最长上升子序列初始化为1 for(int i=0;i<n;i++){maxLen[i]=1;} //从每个元素开始遍历,计算其最长上升子序列的长度for(int i=1;i<n;i++){for(int j=i;j>=0;j--){//maxLen[k]的值等于在ak左边,终点值小于ak,且长度最大的那个上升子序列的长度再加1 if(a[i]>a[j]&&maxLen[i]<=maxLen[j]){maxLen[i]=maxLen[j]+1;}} }//找出整个数组中最长的那个上升子序列 int maxL=maxLen[0];for(int i=0;i<n;i++){if(maxLen[i]>maxL){maxL=maxLen[i];}}return maxL; }
int main(){int a[MAXSIZE];int n;cin>>n;for(int i=0;i<n;i++){cin>>a[i];}cout<<ascendList(a,n);return 0;
}
程序设计与算法----动态规划之最长公共子序列相关推荐
- 程序设计与算法----动态规划之最长上升子序列
问题描述 给出两个字符串,求出这样的一个最长的公共子序列的长度:子序列中的每个字符都能在两个原串中找到,而且每个字符的先后顺序和原串中的顺序一致. 样例输入 abcfbc abfcab program ...
- 算法知识之最长公共子序列问题(动态规划)
最近朋友让帮做个关于动态规划的最长公共子序列的问题,翻看以前的笔记并完成该题后,顺便写这样一篇文章,希望对大家有所帮助,同时也帮助自己回顾该知识点. 一.最长公共子序列的定义 子序列:若给定序列X={ ...
- 最长公共子序列算法 java_转【算法之动态规划(三)】动态规划算法之:最长公共子序列 最长公共子串(LCS)字符串相似度算法...
1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 2.最长公共子串 其实这是一个序贯决策问题 ...
- javascript写算法(一) 动态规划:最长公共子序列
csdn是疯了吗,右下角的广告是一个人站在猪屁股后面打它...看了一下居然是baidu算出来的广告嵌在了iframe里,fixed to viewport,真是够了.最近还频频出现的广告是一个光头男子 ...
- 算法设计 - LCS 最长公共子序列最长公共子串 LIS 最长递增子序列
出处 http://segmentfault.com/blog/exploring/ 本章讲解: 1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度: 2. 与之类似但不 ...
- 动态规划解决最长公共子序列
动态规划解决最长公共子序列 问题描述 给定两个序列,例如 X = "ABCBDAB".Y = "BDCABA",求它们的最长公共子序列的长度. 递归关系 c[i ...
- 动态规划解最长公共子序列(LCS)(附详细填表过程)
目录 相关概念 子序列形式化定义: 公共子序列定义: 最长公共子序列(以下简称LCS): 方法 蛮力法求解最长公共子序列: 动态规划求解最长公共子序列: 分析规律: 做法: 伪代码: 下面演示下c数组 ...
- 动态规划算法之:最长公共子序列 最长公共子串(LCS)
1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 2.最长公共子串 其实这是一个序贯决策问题 ...
- 【动态规划】最长公共子序列与最长公共子串
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
最新文章
- 通用窗口类 Inventory Pro 2.1.2 Demo1(下)
- Chromium 组件DotNetBrowser V1.12发布 | Chromium引擎升级到版本60
- 【错误记录】Android Studio 编译报错 ( A problem occurred starting process ‘command ‘ninja.exe‘ ‘ )
- 颠倒整数的C语言程序,帮忙解决c语言题目1.编写一个程序,用户输入一个小于5位的正整数,把它的各位数字前后颠倒一下,并输出颠倒后的结果。2.编...
- 如何在Marketing Cloud Launchpad里打开外部链接
- c++程序设计中多态与虚函数知识点
- 证监会:对贾跃亭、杨丽杰采取终身证券市场禁入措施
- 梭子鱼下一代防火墙在对比研究中名列榜首
- war包部署到tomcat
- excel图表交互联动_Excel 制作滑动控制联动(Excel数据图表)具体实现方法
- c语言飞机大战游戏素材,jQuery飞机大战游戏
- CAD贱人工具箱插件
- SPSS25 软件安装教程(附带网盘资源)
- 苹果Macbook电脑无法进入系统
- android aidl参数contentvalues,Android Studio实现进程间通信AIDL详细步骤
- 【VS2015】Win7 X64上面安装VS2015
- 解决白天黑夜模式切换导致Fragment崩溃问题
- Balanced Array
- 图像处理与机器视觉初学者学习路线
- Python参数化接口测试demo笔记
热门文章
- linux yum的用法【ZT】
- 从微信浏览器,调起本地应用,最简单的解决方案
- 非常实用的安卓第三方库
- python3 生成器_python3基础之生成器
- c++ 标准异常类层次结构_Java入门教程十一(异常处理)
- 【Flink】Flink 源码阅读笔记(15)- Flink SQL 整体执行框架
- 20-100-040-安装-Centos 7.5 安装MYSQL
- 【elasticsearch】 document 查询原理
- 【MySQL】OPTIMIZE TABLE 的碎片整理功能
- MyIbatis :不使用XML和注解@Mapper以及MapperScan