北京大学郭炜-最长上升子序列 动态规划讲解
北京大学郭炜-最长上升子序列 动态规划讲解
问题原型:
解题思路:
找子问题,题目要求我们求1~n的最长上升子序列的长度,那我们想一想:1-2个元素的最长上升子序列的长度是多少,第1个元素的最长上升子序列又是多少?
假设我们输入一个序列:
9
2 7 1 5 6 4 3 8 9
显然
第1个元素的最长上升子序列的长度为1
1-2个元素的最长上升子序列为(2 7),长度为2
1-3个元素的最长上升子序列为(2 7)(2 1),长度为2
1-4个元素的最长上升子序列有(2 7)(2 1)(2 5)(1 5),长度也为2
由此可见,我们是可以通过遍历0~i-1个元素的最长上升子序列来得到i的最长上升子序列的。
我们建立一个和输入序列一样长的数组maxLen,来记录每一个元素从0~该元素位置的最长上升子序列的长度。maxLen中每一个元素的初值为1,因为倘若序列中元素i前面的数字都比i大,那么元素i对应位置的最长上升子序列长度就是自己一单位的长度,即为1。
具体写法我们代码里面说:
#include "iostream"
#include <vector>
#include <algorithm>
using namespace std;
int main(){int n,elem;vector<int> a,maxLen;cin>>n;for (int i=0;i<n;i++){cin>>elem;a.push_back(elem);// 设置每个元素默认最长上升子序列为1maxLen.push_back(1);//maxLen记录的是第0个元素到第i个元素的最长上升子序列的长度}//第一层for循环遍历输入的每一个元素,找出该元素的最长上升子序列的长度for (int i=1;i<n;i++){//第二层for循环遍历该元素前所有的元素for (int j=0;j<i;j++){//如果元素a[i]大于元素a[j],说明序列上升了if (a[i]>a[j]){maxLen[i] = max(maxLen[i],maxLen[j]+1);}}}sort(maxLen.begin(),maxLen.end(),greater<int>());cout<<maxLen[0];
}
北京大学郭炜-最长上升子序列 动态规划讲解相关推荐
- 最长公共子序列 - 北京大学郭炜 动态规划代码详解
最长公共子序列 - 北京大学郭炜 动态规划代码详解 解题思路: 该题可用动态规划解决.动态规划需要我们找出子问题. 假设我们输入两个字符串: ACTTGACC CGTT 那么如何通过动态规划算出其最大 ...
- 【ACM】最长公共子序列 - 动态规划
最长公共子序列 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列. tip:最长公共子序列也称作最长 ...
- 最长上升子序列——动态规划
这个是用动态规划做的一道题,先学习一下动态规划的概念吧. 用动态规划解题,就是要把问题分解为一个个子问题,对子问题进行求解,而子问题又可以继续进行分解,直到一定小的规模. DP与递归类似,但递归会 ...
- C语言(CED)最长公共子序列----动态规划第一题
一.动态规划算法与分治法的异同 相同点: A.二者均是将待求解的问题分成若干子问题来求解. B.二者在编写代码的时候,都要用到递归. 不同点: A.分治法求解的问题,在将问题分成若干子问题之后,其子问 ...
- 最长公共子序列-动态规划(C/C++)
动态规划简述 使用最优子结构特性,动态规划算法采用自底向上的方式计算,在求解的过程中保存已经计算好的子问题的最优解,当子问题的最优解被重复使用时,无需再次计算直接从保存的空间中调用. 举个例子: 斐波 ...
- 最长公共子序列动态规划c语言,动态规划----最长公共子序列(C++实现)
最长公共子序列 题目描述:给定两个字符串s1 s2 - sn和t1 t2 - tm .求出这两个字符串的最长公共子序列的长度.字符串s1 s2 - sn的子序列指可以表示为 - { i1 < i ...
- 最长公共子序列--动态规划(C++)
动态规划与分治方法类似,都是通过组合子问题来求解原问题.分治法将问题分为互不相交的子问题,递归的求解子问题,再将他们的解组合起来,求出原问题的解.相反的,动态规划用于子问题重叠的情况,即不同的子问题具 ...
- python【力扣LeetCode算法题库】300 最长上升子序列(动态规划)
最长上升子序列 给定一个无序的整数数组,找到其中最长上升子序列的长度. 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的 ...
- 116. Leetcode 1143. 最长公共子序列 (动态规划-子序列问题)
步骤一.确定状态: 确定dp数组及下标含义 dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长 公共子序列为dp[i][j] 步骤二.推 ...
最新文章
- 【机器学习】基于人工鱼群算法的非线性函数寻优
- 聚焦AI落地痛点,纵论跨域学习技术前沿和应用趋势 | CNCC技术论坛
- Visual Studio 2015价格大幅下调
- 加快发展设施业 农业大健康-林裕豪:从玉农业践行基础支撑
- sap scc4 客户端设置
- 在 Windows 7 中安装上网认证客户端
- android 程序退出广播,android 利用广播实现程序的强制退出
- centos 安装jdk_CentOS 7 安装 Oracle JDK 8
- MongoDB作为windows服务来安装-2
- gif分解工具_Python之GIF图倒放,沙雕快乐源泉
- 2020蓝桥杯省赛---java---B---4( 合并检测)
- CCF201712-1 最小差值
- 别再刷百度厂长被浇水啦!来看看大百度APP-首屏秒开优化实践
- python爬虫入门
- 科技爱好者周刊(第 165 期):全端 App 的时代
- Python实现十大经典算法动画图解
- Linux下Intel网卡固件烧写工具
- [常用工具]深度学习Caffe处理工具
- 单车架的ANSYS有限元分析
- 关于野火mini led的学习