动态规划作业 最长单调递增子序列
动态规划作业
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函数开辟动态数组的空间,此时开辟的数组空间为堆空间,可避免溢出隐患。
动态规划作业 最长单调递增子序列相关推荐
- 输出最长单调递增子序列java_动态规划实现最长单调递增子序列
1. 实验环境 操作系统:Mac 64 运行内存:16GB 编程语言:Java 编译环境:Eclipse 2. 题目要求 设计一个Ο(nlgn)时间的算法,求一个 n 个数的序列的最长单调递增子序列. ...
- 最长单调递增子序列 动态规划 (java)
题目描述: 设计一个O(N^2)算法,找出n个数据组成的序列的最长单调递增子序列. 输入示例: 8 1 2 3 -9 3 9 0 11 输出示例: 5 1 2 3 9 11 设计思路: 有一个数组 a ...
- 最长单调递增子序列--动态规划
最长单调递增子序列定义: 问题描述: 设计一个O(n2)时间的算法, 找出由n个数组成的序列的最长单调递增子序列. 输入 第1个整数n(0<n<100),表示后面有n个数据,全部为整数. ...
- 最长单调递增子序列 [转]
[转] http://skynewborn.blog.sohu.com/66594610.html 单调子序列包含有单调递增子序列和递减子序列,不失一般性,这里只讨论单调递增子序列.首先,从定义上明确 ...
- 最长单调递增子序列 python_最长单调递增子序列
前面三篇博客分别讲了贪心,递归,分治,今天就说个简单的动态规划(DP)的题目吧.在我心中DP算是比较难的算法,尤其像状态DP,树形DP,因为实力问题就说一个简单的线性DP--最长单调递增子序列. 题目 ...
- 最长单调递增子序列O(NlogN)算法
O(NlgN)算法 假设存在一个序列d[1..9] ={ 2,1 ,5 ,3 ,6,4, 8 ,9, 7},可以看出来它的LIS长度为5. 下面一步一步试着找出它. 我们定义一个序列B,然后 ...
- java最长单调递增子序列_最长单调递增子序列问题
最长单调递增子序列问题 题目:设计一个 O( n ^ 2 )复杂度的算法,找出由 n 个数组成的序列的最长单调递增子序列. import java.util.Scanner; public class ...
- 最长单调递增子序列(时间复杂度O(nlogn))
写在前面:仅为个人代码/总结,未必标准,仅供参考!如有错误,还望指出交流,共同进步! 最长单调递增子序列 [题目描述] 找出由n个数组成的序列中的最长单调递增子序列及其长度. [O(n*n)算法解题思 ...
- 算法实验-最长单调递增子序列长度
问题描述 解决思路 O(n^2) 首先考虑使用动态规划的方法解决该问题.首先将原问题分解为子问题.对于长度为n的序列(从下标1开始),假设前n-1个元素形成了n-1个以arr[i]结尾的单调递增最长子 ...
最新文章
- 10个 我经常逛的国外技术社区,真的受益匪浅!
- linux定时执行python脚本_linux定时执行python脚本的方法以及失败不执行的处理方法...
- 输入十个数,输出其中最大数、下标,用函数实现
- [刷题]算法竞赛入门经典(第2版) 4-3/UVa220 - Othello
- steelray project viewer
- linux scp限制传输速度
- python 自定义数据类型_【整理合集,建议收藏】Python数据类型(一)
- tp5 ThinkPHP5 自定义异常处理类
- 调试记录:基于NCN5120芯片的KNX-485桥接模块
- android手机解除root,手机一键ROOT以后如何解除?手机root后怎么恢复
- CSS尺寸与文本讲解。HTML、CSS笔记(四)。
- 蓝拓扑便携式分析仪驱动程序_拔出便携式USB硬盘驱动器会损坏计算机吗?
- Oracle 基本语句语法
- 专接本 微机原理简答题 更新
- Snipaste - 截图贴图软件
- (Paper)Network in Network网络分析
- 装完某些软件之后IE主页被https://www.hao123.com/?tn=93453552_hao_pg劫持
- 商业化广告--体系学习-- 6 -- 行业蓝图篇 -- 那些产品适合采用广告模式变现
- 怎么查看iOS iPhone的Safari版本userAgent
- 肆拾柒- Tableau Dashboard Extension 的绝望之旅 (二) - 整体结构介绍
热门文章
- 中国大数据发展报告发布 贵州获多项全国第一
- 全开源html5自助建站系统源码 含700+网站模板和搭建教程
- Java设计模式之简单工厂模式(Simple Factory)
- 基本运用(一个一个字读)
- 华清远见fs4412开发板学习笔记(四)
- ue4小白人骨骼定义_UE4同一结构的骨架之间动画共享。
- 熟悉markdown语音
- CSDN 论坛板块升级规则
- 干货系列:高通量测序后的下游实验验证方法——m6A RNA甲基化篇|易基因
- pta上怎么搜题目_完成pta(函数题)习题6-3、6-5、6-6,代码复制在下方答案中,并在pta平台中完成。_学小易找答案...