最大上升子序列的理解

经典dp,两重for循环:

int maxv = 1;

for (int i = 1; i < count; i++)

{

printf("check element: %d\n", nums[i]);

for (int j = 0; j < i; j++)

{

if (nums[i] > nums[j])

dp[i] = max(dp[j] + 1, dp[i]);

}

printf("dp[%d]: %d\n", i, dp[i]);

maxv = max(maxv, dp[i]);

}

一定要注意的是,对于i和j指定的元素,均表示假设以此元素为最大上升子序列的最后一个元素,如果没有这个假设,这个算法是无法正确理解的。

当然dp[i]也表示以第i个元素作为最大上升子序列的最后一个元素的长度,而不是i个元素的完整序列的最大上升序列长度,要搞清楚,否则无法理解。

时间: 2024-10-11 07:51:00

最大上升子序列的理解的相关文章

LIS最长上升子序列O(n^2)与O(nlogn)的算法

动态规划 最长上升子序列问题(LIS).给定n个整数,按从左到右的顺序选出尽量多的整数,组成一个上升子序列(子序列可以理解为:删除0个或多个数,其他数的顺序不变).例如序列1, 6, 2, 3, 7, 5,可以选出上升子序列1, 2, 3, 5,也可以选出1, 6, 7,但前者更长.选出的上升子序列中相邻元素不能相等. 最容易想到的办法就是用一个数组f[i]保存到达第i个数的LIS 初始化f[i]=1 更新 f[i]=max{f[j]+1,f[i]|a[j]<a[i],1<=j<i} 即

04_最长上升子序列问题(LIS)

来源:刘汝佳<算法竞赛入门经典--训练指南> P60 问题6: 问题描述:给定n个整数a1,a2,...,an,按从左到右的顺序选出尽量多的整数,组成一个上升子序列(子序列可以理解为:删除0个或多个数,其他的数顺序不变).比如,从序列1,6,2,3,7,5中,可以选上升子序列1,2,3,5,也可以选出1,6,7:但前者更长.选出的相邻元素不能相等. O(n^2)的时间复杂度思路分析:设d[i]为以i结尾的最长上升子序列的长度,则d[i]=Max{0,d[j](满足j<i,aj<a[

DP入门(4)——线性结构上的动态规划

一.最长上升子序列(LIS) 给定n个整数A1,A2,-,An,按从左到右的顺序选出尽量多的整数,组成一个上升子序列(子序列可以理解为:删除0个或多个数,其他数的顺序不变).例如序列1,6,2,3,7,5,可以选出上升子序列1,2,3,5,也可以选出1,6,7,但前者更长.选出的上升子序列中相邻元素不能相等. 分析:设d(i)为以i结尾的最长上升子序列的长度,则d(i)= max{0,d(j)|j<i,Aj<Ai}+1,最终答案是max{d(i)}.如果LIS中的相邻元素可以相等,把<改

JAVASE笔记回顾

第一部分,JAVA基础和面向对象 part01 入门与开发环境搭建 1: 计算机基础知识(了解)(1)计算机(2)计算机硬件(3)计算机软件系统软件:windows,linux,mac应用软件:QQ,YY,扫雷,CS/F(4)软件开发就是用开发工具和计算机语言做出软件(5)计算机语言人与计算机的交流方式(6)人机交互A:图像界面方便,简单,直观.B:DOS 窗口方式要有控制台, 要记住很多的命令, 麻烦.(7)键盘功能键和快捷键的介绍(掌握)A:键盘功能键tabshiftctrlalt空格ent

CometOJ 双倍快乐(简单DP)

链接:https://www.cometoj.com/contest/48/problem/B 题意:给出一串数列,要求在这个数列中找出两条“不相交”的非下降子序列使得子序列之和最大.“不相交”即不存在任意的ai同时存在于两个子序列中. 分析:笔者刷题量不多,这道题对笔者加深动态规划求子序列的理解很有帮助:题目要求非下降子序列的最大和,这里我们要求的是两条子序列.做题时的第一想法是走两遍DP,先求出一条和最大的子序列,把这条子序列中的元素给剔除,接着再重复该步骤,得到另一条和最大的子序列,最后把

动态规划(dp)----公共子序列(LCS) 问题进一步理解

相对于上一篇 初级 ,这道题稍加深难度,下面这题,比上面多了一个最长子序列的输出,测试一下理解程度,逆序过程 51nod1006 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的) 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列. Input 第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000) Output 输出最长的子序列,如果有多个,随意输出1个. Input示例

算法面试题 之 最长递增子序列 LIS

找出最长递增序列 O(NlogN)(不一定连续!) 参考 http://www.felix021.com/blog/read.php?1587%E5%8F%AF%E6%98%AF%E8%BF%9E%E6%95%B0%E7%BB%84%E9%83%BD%E6%B2%A1%E7%BB%99%E5%87%BA%E6%9D%A5 我就是理解了一下他的分析 用更通俗易懂的话来说说题目是这样 d[1..9] = 2 1 5 3 6 4 8 9 7 要求找到最长的递增子序列首先用一个数组b[] 依次的将d里面

分治策略 - 最大子序列问题

自开始学习算法起,我感觉就是跪着把<算法导论>的代码看一遍.理解一遍然后敲一遍...说实话自己来写并且要求时间复杂度达到要求,我肯定是不能做到的,但我想前辈们辛苦积累的研究成果贡献出来也是为了让后人少走一些弯路,所以我的作用就是把前辈们的成果学习之后加以理解,然后积累经验,领悟到他们解决问题时的思路和灵感.还有就是把个人理解后的知识存储在不会忘记的地方作为复习备用... 当然什么是写博客呢,我个人认为是把所学的知识加上自己的理解然后用较为通俗的语言来解释一遍,至少这样才有可能把学到的东西变为自

HDU 1003 Max Sum【动态规划求最大子序列和详解 】

Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 250714    Accepted Submission(s): 59365 Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max su