问题描述

一个数的序列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;
} 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. 动态规划算法之:最长公共子序列 最长公共子串(LCS)

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

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

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

最新文章

  1. 通用窗口类 Inventory Pro 2.1.2 Demo1(下)
  2. Chromium 组件DotNetBrowser V1.12发布 | Chromium引擎升级到版本60
  3. 【错误记录】Android Studio 编译报错 ( A problem occurred starting process ‘command ‘ninja.exe‘ ‘ )
  4. 颠倒整数的C语言程序,帮忙解决c语言题目1.编写一个程序,用户输入一个小于5位的正整数,把它的各位数字前后颠倒一下,并输出颠倒后的结果。2.编...
  5. 如何在Marketing Cloud Launchpad里打开外部链接
  6. c++程序设计中多态与虚函数知识点
  7. 证监会:对贾跃亭、杨丽杰采取终身证券市场禁入措施
  8. 梭子鱼下一代防火墙在对比研究中名列榜首
  9. war包部署到tomcat
  10. excel图表交互联动_Excel 制作滑动控制联动(Excel数据图表)具体实现方法
  11. c语言飞机大战游戏素材,jQuery飞机大战游戏
  12. CAD贱人工具箱插件
  13. SPSS25 软件安装教程(附带网盘资源)
  14. 苹果Macbook电脑无法进入系统
  15. android aidl参数contentvalues,Android Studio实现进程间通信AIDL详细步骤
  16. 【VS2015】Win7 X64上面安装VS2015
  17. 解决白天黑夜模式切换导致Fragment崩溃问题
  18. Balanced Array
  19. 图像处理与机器视觉初学者学习路线
  20. Python参数化接口测试demo笔记

热门文章

  1. linux yum的用法【ZT】
  2. 从微信浏览器,调起本地应用,最简单的解决方案
  3. 非常实用的安卓第三方库
  4. python3 生成器_python3基础之生成器
  5. c++ 标准异常类层次结构_Java入门教程十一(异常处理)
  6. 【Flink】Flink 源码阅读笔记(15)- Flink SQL 整体执行框架
  7. 20-100-040-安装-Centos 7.5 安装MYSQL
  8. 【elasticsearch】 document 查询原理
  9. 【MySQL】OPTIMIZE TABLE 的碎片整理功能
  10. MyIbatis :不使用XML和注解@Mapper以及MapperScan