最长上升子序列(动态规划)
子序列
所谓的子序列就是在原来序列中找出一部分组成的序列。
与子段不同,不需要连续的某一段,但是要保持原序列的先后顺序
最长上升子序列
在子序列的基础上,后一项大于前一项。
【题目描述】
【输入格式】
【输出格式】
【输入样例】
12
35 42 4 12 29 21 29 11 1 42 43 49
【输出样例】
7
【数据范围】
分析
我们会想到用递推做。
对于递推,我们需要考虑以下几点
- 状态,即F[ i ]表示什么
- 递推式,即怎么由前面的项推出后面的项
- 答案
- 初始值
状态
我们给出一组数
方向一(错误):F[ i ]表示前 i 项的上升子序列的最大长度
那我们把F[ i ]写在第 i 项的上面
发现F[ i ]都能列出来,但是递推式完全出不来,前项和后项根本无法递推
方向二:F[ i ]表示以第 i 项为结尾的上升子序列的最大长度
得到:
这就可以递推了
如果a[ j ] < a[ i ],那就可以形成上升子序列,则F[ i ]为F[ j ]+1和自己本身的较大数
如此循环,那
递推式
就很清楚了,就是:
答案
显而易见,F[ i ]中的最大值
初始值
如果都不符合a[ j ] < a[ i ],那么F[ i ]就是1
所以初始值是1而不是0
最后最后,
附上代码
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;long long a[5010];
int f[5010];
//f[i]表示以第i项结尾的最长上升子序列
int main()
{int n;cin >> n;for(int i = 1;i <= n;i++){cin >> a[i];}int maxn = 0;for(int i = 1;i <= n;i++){f[i] = 1;//初值for(int j = 1;j <= i - 1;j++){if(a[j] < a[i])f[i] = max(f[i],f[j] + 1);maxn = max(maxn,f[i]);}}cout << maxn;return 0;
}
最长上升子序列(动态规划)相关推荐
- 北京大学郭炜-最长上升子序列 动态规划讲解
北京大学郭炜-最长上升子序列 动态规划讲解 问题原型: 解题思路: 找子问题,题目要求我们求1~n的最长上升子序列的长度,那我们想一想:1-2个元素的最长上升子序列的长度是多少,第1个元素的最长上升子 ...
- 【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] 步骤二.推 ...
- 111. Leetcode 300. 最长递增子序列 (动态规划-子序列问题)
步骤一.确定状态: 确定dp数组及下标含义 dp是长度为len(nums)的数组,dp[i]表示以nums[i]结尾的最长子序列的长度, 这个定义中 nums[i] 必须被选取,且必须是这个子序列的最 ...
最新文章
- mysql主从复制错误sql-running no
- python3中unicode怎么写_详解python3中ascii与Unicode使用
- 自动ssh登录的几种方法
- 【Android 性能优化】布局渲染优化 ( CPU 渲染优化 | 减少布局的嵌套 | 测量布局绘制时间 | OnFrameMetricsAvailableListener | 布局渲染优化总结 )
- android 布局权重问题(最近布局经常坑爹)
- 深度学习初学者必备资料整理
- 【复杂系统迁移 .NET Core平台系列】之迁移项目工程
- PLSQL 日期格式修改
- GB/T 28181-2016与GB/T 28181-2011变更对比
- VMware15.5.2安装unlocker时下载工具一直失败
- firefox火狐浏览器显示多列书签菜单
- 可编程并行接口芯片8255
- 16 计算二叉树叶子结点数目(耿 6.14)
- 王阳明:一个人不开心的真正原因:智慧不够
- 软件测试中 Bug 书写规范
- 安卓自定义View画钟实现转动
- [艺术创作]摄影构图的传统法则
- 破解工具ida解决乱码问题
- 2023年PMP 续证的费用和流程最全介绍
- java实现8位以为的自幂数(水仙花数)