动态规划作业
1.最长单调递增子序列
设计一个 O(n2)时间的算法,找出由 n 个数组成的序列 a 的最长单调递增子序列。

提示:

用数组 b[0:n]纪录以 a[i] (0<= i< n),为结尾元素的最长递增子序列的
长度。将计算 b[i]转化为 i 个规模更小的子问题。

■ Input

第一行包含一个整数,表示数组 a 的长度。
接下来的一行,包含 n 个数,依次表示 a[i]。

■ Output

输出一行表示对应的答案。
Sample:

■ Sample Input 1

5
2 9 3 7 6

■ Sample Output 1

2 3 6

2.作业要求
采用动态规划编程实现最长单调递增子序列问题,提交作业报告,作业报告
包括:概述解题思路、算法实现。作业报告名为“最长单调递增子序列-班级-学号-姓名”。作业报告包括:

1)概述解题思路
2)源代码,代码的关键步骤加上必要的注释。
3)截屏 Input 及 Output 的测试样例和结果。

1.概述思路
对于最长递增子序列的长度:
(1)用数组 b[0:n]记录以 a[i] (0<= i< n),为结尾元素的最长递增子序列的长度。
(2)对于序列中第一个数a[0],显然有b[0]=1,之后可以从左向右按顺序计算a[i](i=1,2,3,…… ,n)作为结尾元素时,最长递增子序列的长度b[i]。
(3)当计算到 a[i]的最长递增子序列时,需要求得以 a[i]作为结尾元素时的最长递增子序列的长度b[i]。如果,此时最长递增子序列恰以a[i]结尾,那么,在序列a[0:i-1]中所有比a[i]小的数都可以作为递增子序列的倒数第二个数。为确保递增子序列最长,应该选择比a[i]小的数中以该数结尾的递增子序列长度最长的那个数,作为子序列的倒数第二个数,即b[i]=max{b[j]+1}(0≤ j < i且 a[j] < a[i]);如果序列a[0:i-1]中所有的数均不小于a[i],则令b[i]=1,即以a[i]为结尾元素时的最长递增子序列只包含a[i]本身。

对于最长递增子序列:
(1)首先遍历数组b[n],找到最大值及其下标k(即位置)。
(2)从a[k]开始,从右向左依次遍历数组a[n]。对于某个下标l(0 ≤ l < k),如果l满足a[l] < a [k]且b[l] = b[k] - 1,则a[l]可以作为最长递增子序列的倒数第二个数。
(3)从a[l]开始,从右向左依次遍历数组a[n],按照(2)中的方法找到最长递增子序列的倒数第三个数。
(4)重复上述步骤,直到不存在比当前序列中第一个数更小的数,则最长递增子序列构建完成。

注意:

存在多解的情况,只需要返回其中一种即可。

2.代码

#include<bits/stdc++.h>
using namespace std;int main(){int n;cin >> n;           //输入数组a的长度nint a[n],b[n];for(int i = 0; i < n; ++i){cin >> a[i];    //依次输入数组a的n个元素}b[0] = 1;          //第一个数的最长递增子序列长度为1,即只有它本身for(int i = 1; i < n; ++i){int max = 0;                   //记录下标小于i的数a[0:i-1]中最长递增子序列的长度for(int j = 0; j < i; ++j){    //遍历查询以a[j](j<i)为结尾元素的最长递增子序列的长度,将最大值赋予maxif(a[j] < a[i]){if(max < b[j]){max = b[j];}}}b[i] = max + 1;     //依次记录最长递增子序列的长度b[i]}int length, l = 0;    //记录最长递增子序列的长度int k = 0;         //记录最长递增子序列中最后一个数在数组a中的下标for(int i = 0; i < n; ++i){if(b[i] > length){length = b[i];k = i;l = length;}}int* LIS = (int*) malloc(sizeof(int) * length);LIS[--length] = a[k];    //初始化最长递增子序列LIS,LIS中的最后一个数是a[k]for(int i = k; i >= 0; i--){if(a[i] < a[k] && b[i] == b[k] - 1){LIS[--length] = a[i];     //逆序将最长递增子序列中的元素依次填入LIS中k = i;}}for(int i = 0; i < l; ++i){cout << LIS[i] << " ";}return 0;
}

3.测试结果

tips:

注意在C++中,允许在初始化数组时,直接使用变量值作为数组长度,此时开辟的数组空间为栈空间(长度为8192),有发生栈溢出的风险。建议使用更加规范的malloc函数开辟动态数组的空间,此时开辟的数组空间为堆空间,可避免溢出隐患。

动态规划作业 最长单调递增子序列相关推荐

  1. 输出最长单调递增子序列java_动态规划实现最长单调递增子序列

    1. 实验环境 操作系统:Mac 64 运行内存:16GB 编程语言:Java 编译环境:Eclipse 2. 题目要求 设计一个Ο(nlgn)时间的算法,求一个 n 个数的序列的最长单调递增子序列. ...

  2. 最长单调递增子序列 动态规划 (java)

    题目描述: 设计一个O(N^2)算法,找出n个数据组成的序列的最长单调递增子序列. 输入示例: 8 1 2 3 -9 3 9 0 11 输出示例: 5 1 2 3 9 11 设计思路: 有一个数组 a ...

  3. 最长单调递增子序列--动态规划

    最长单调递增子序列定义: 问题描述: 设计一个O(n2)时间的算法, 找出由n个数组成的序列的最长单调递增子序列. 输入 第1个整数n(0<n<100),表示后面有n个数据,全部为整数. ...

  4. 最长单调递增子序列 [转]

    [转] http://skynewborn.blog.sohu.com/66594610.html 单调子序列包含有单调递增子序列和递减子序列,不失一般性,这里只讨论单调递增子序列.首先,从定义上明确 ...

  5. 最长单调递增子序列 python_最长单调递增子序列

    前面三篇博客分别讲了贪心,递归,分治,今天就说个简单的动态规划(DP)的题目吧.在我心中DP算是比较难的算法,尤其像状态DP,树形DP,因为实力问题就说一个简单的线性DP--最长单调递增子序列. 题目 ...

  6. 最长单调递增子序列O(NlogN)算法

     O(NlgN)算法 假设存在一个序列d[1..9] ={ 2,1 ,5 ,3 ,6,4, 8 ,9, 7},可以看出来它的LIS长度为5.  下面一步一步试着找出它.  我们定义一个序列B,然后 ...

  7. java最长单调递增子序列_最长单调递增子序列问题

    最长单调递增子序列问题 题目:设计一个 O( n ^ 2 )复杂度的算法,找出由 n 个数组成的序列的最长单调递增子序列. import java.util.Scanner; public class ...

  8. 最长单调递增子序列(时间复杂度O(nlogn))

    写在前面:仅为个人代码/总结,未必标准,仅供参考!如有错误,还望指出交流,共同进步! 最长单调递增子序列 [题目描述] 找出由n个数组成的序列中的最长单调递增子序列及其长度. [O(n*n)算法解题思 ...

  9. 算法实验-最长单调递增子序列长度

    问题描述 解决思路 O(n^2) 首先考虑使用动态规划的方法解决该问题.首先将原问题分解为子问题.对于长度为n的序列(从下标1开始),假设前n-1个元素形成了n-1个以arr[i]结尾的单调递增最长子 ...

最新文章

  1. 10个 我经常逛的国外技术社区,真的受益匪浅!
  2. linux定时执行python脚本_linux定时执行python脚本的方法以及失败不执行的处理方法...
  3. 输入十个数,输出其中最大数、下标,用函数实现
  4. [刷题]算法竞赛入门经典(第2版) 4-3/UVa220 - Othello
  5. steelray project viewer
  6. linux scp限制传输速度
  7. python 自定义数据类型_【整理合集,建议收藏】Python数据类型(一)
  8. tp5 ThinkPHP5 自定义异常处理类
  9. 调试记录:基于NCN5120芯片的KNX-485桥接模块
  10. android手机解除root,手机一键ROOT以后如何解除?手机root后怎么恢复
  11. CSS尺寸与文本讲解。HTML、CSS笔记(四)。
  12. 蓝拓扑便携式分析仪驱动程序_拔出便携式USB硬盘驱动器会损坏计算机吗?
  13. Oracle 基本语句语法
  14. 专接本 微机原理简答题 更新
  15. Snipaste - 截图贴图软件
  16. (Paper)Network in Network网络分析
  17. 装完某些软件之后IE主页被https://www.hao123.com/?tn=93453552_hao_pg劫持
  18. 商业化广告--体系学习-- 6 -- 行业蓝图篇 -- 那些产品适合采用广告模式变现
  19. 怎么查看iOS iPhone的Safari版本userAgent
  20. 肆拾柒- Tableau Dashboard Extension 的绝望之旅 (二) - 整体结构介绍

热门文章

  1. 中国大数据发展报告发布 贵州获多项全国第一
  2. 全开源html5自助建站系统源码 含700+网站模板和搭建教程
  3. Java设计模式之简单工厂模式(Simple Factory)
  4. 基本运用(一个一个字读)
  5. 华清远见fs4412开发板学习笔记(四)
  6. ue4小白人骨骼定义_UE4同一结构的骨架之间动画共享。
  7. 熟悉markdown语音
  8. CSDN 论坛板块升级规则
  9. 干货系列:高通量测序后的下游实验验证方法——m6A RNA甲基化篇|易基因
  10. pta上怎么搜题目_完成pta(函数题)习题6-3、6-5、6-6,代码复制在下方答案中,并在pta平台中完成。_学小易找答案...