子序列

所谓的子序列就是在原来序列中找出一部分组成的序列。

与子段不同,不需要连续的某一段,但是要保持原序列的先后顺序

最长上升子序列

在子序列的基础上,后一项大于前一项

【题目描述】

【输入格式】

【输出格式】

【输入样例】

12
35 42 4 12 29 21 29 11 1 42 43 49

【输出样例】

7

【数据范围】

分析

我们会想到用递推做。

对于递推,我们需要考虑以下几点

  1. 状态,即F[ i ]表示什么
  2. 递推式,即怎么由前面的项推出后面的项
  3. 答案
  4. 初始值

状态

我们给出一组数

方向一(错误):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. 北京大学郭炜-最长上升子序列 动态规划讲解

    北京大学郭炜-最长上升子序列 动态规划讲解 问题原型: 解题思路: 找子问题,题目要求我们求1~n的最长上升子序列的长度,那我们想一想:1-2个元素的最长上升子序列的长度是多少,第1个元素的最长上升子 ...

  2. 【ACM】最长公共子序列 - 动态规划

    最长公共子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列. tip:最长公共子序列也称作最长 ...

  3. 最长上升子序列——动态规划

    这个是用动态规划做的一道题,先学习一下动态规划的概念吧.   用动态规划解题,就是要把问题分解为一个个子问题,对子问题进行求解,而子问题又可以继续进行分解,直到一定小的规模. DP与递归类似,但递归会 ...

  4. C语言(CED)最长公共子序列----动态规划第一题

    一.动态规划算法与分治法的异同 相同点: A.二者均是将待求解的问题分成若干子问题来求解. B.二者在编写代码的时候,都要用到递归. 不同点: A.分治法求解的问题,在将问题分成若干子问题之后,其子问 ...

  5. 最长公共子序列-动态规划(C/C++)

    动态规划简述 使用最优子结构特性,动态规划算法采用自底向上的方式计算,在求解的过程中保存已经计算好的子问题的最优解,当子问题的最优解被重复使用时,无需再次计算直接从保存的空间中调用. 举个例子: 斐波 ...

  6. 最长公共子序列动态规划c语言,动态规划----最长公共子序列(C++实现)

    最长公共子序列 题目描述:给定两个字符串s1 s2 - sn和t1 t2 - tm .求出这两个字符串的最长公共子序列的长度.字符串s1 s2 - sn的子序列指可以表示为 - { i1 < i ...

  7. 最长公共子序列--动态规划(C++)

    动态规划与分治方法类似,都是通过组合子问题来求解原问题.分治法将问题分为互不相交的子问题,递归的求解子问题,再将他们的解组合起来,求出原问题的解.相反的,动态规划用于子问题重叠的情况,即不同的子问题具 ...

  8. python【力扣LeetCode算法题库】300 最长上升子序列(动态规划)

    最长上升子序列 给定一个无序的整数数组,找到其中最长上升子序列的长度. 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的 ...

  9. 116. Leetcode 1143. 最长公共子序列 (动态规划-子序列问题)

    步骤一.确定状态: 确定dp数组及下标含义 dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长 公共子序列为dp[i][j] 步骤二.推 ...

  10. 111. Leetcode 300. 最长递增子序列 (动态规划-子序列问题)

    步骤一.确定状态: 确定dp数组及下标含义 dp是长度为len(nums)的数组,dp[i]表示以nums[i]结尾的最长子序列的长度, 这个定义中 nums[i] 必须被选取,且必须是这个子序列的最 ...

最新文章

  1. mysql主从复制错误sql-running no
  2. python3中unicode怎么写_详解python3中ascii与Unicode使用
  3. 自动ssh登录的几种方法
  4. 【Android 性能优化】布局渲染优化 ( CPU 渲染优化 | 减少布局的嵌套 | 测量布局绘制时间 | OnFrameMetricsAvailableListener | 布局渲染优化总结 )
  5. android 布局权重问题(最近布局经常坑爹)
  6. 深度学习初学者必备资料整理
  7. 【复杂系统迁移 .NET Core平台系列】之迁移项目工程
  8. PLSQL 日期格式修改
  9. GB/T 28181-2016与GB/T 28181-2011变更对比
  10. VMware15.5.2安装unlocker时下载工具一直失败
  11. firefox火狐浏览器显示多列书签菜单
  12. 可编程并行接口芯片8255
  13. 16 计算二叉树叶子结点数目(耿 6.14)
  14. 王阳明:一个人不开心的真正原因:智慧不够
  15. 软件测试中 Bug 书写规范
  16. 安卓自定义View画钟实现转动
  17. [艺术创作]摄影构图的传统法则
  18. 破解工具ida解决乱码问题
  19. 2023年PMP 续证的费用和流程最全介绍
  20. java实现8位以为的自幂数(水仙花数)

热门文章

  1. java复杂逻辑如何设计_javabean如何实现复杂的业务逻辑
  2. 微信小程序AR扫描识别图(支持多图片)加载3D模型及其动画
  3. Potplayer关闭播放时的信息
  4. 获取checkbox中被选中的值
  5. RMAN的备份与恢复
  6. for循环结构(语句)的基本用法
  7. Could not set parameters for mapping解决方法
  8. TransTrack: Multiple Object Tracking with Transformer
  9. pgsql中实现按周统计,计算日期是周几
  10. 农业物联网发展有哪些问题