递增子序列--连续与不连续
问题一:最长严格递增子序列的长度
题目:
给定一个整数数组 nums ,找到其中最长严格递增子序列的长度。
状态定义:
dp[i] 表示以 nums[i] 结尾的最长严格递增子序列的长度。
状态转移方程
对于每个 nums[i],遍历其之前的所有元素 nums[j](j 从 0 到 i-1),如果 nums[i] > nums[j],则可以考虑将 nums[i] 加入到以 nums[j] 结尾的最长递增子序列中,状态转移方程为: dp[i] = max(dp[i], dp[j] + 1)。
动态规划解法:
我们使用 dp[i]
表示以 nums[i]
结尾的最长严格递增子序列的长度,不一定是连续的。(这就涉及到了选择的问题,我们需要考虑每个元素是否应该包含在递增子序列中。为了解决这个问题,我们使用动态规划数组 dp,其中 dp[i] 表示以 nums[i] 结尾的最长递增子序列的长度。在更新 dp[i] 的过程中,需要考虑所有比 nums[i] 小的元素,并选择其中最长的递增子序列进行延伸。这就需要使用两层循环,其中外层循环遍历每个元素,内层循环遍历之前的元素,以确保每个元素都被考虑。)为了求解 dp[i]
,我们需要考虑所有在 i
之前的元素 nums[j]
,其中 j
可以从 0
到 i-1
。如果 nums[i] > nums[j]
,说明 nums[i]
可以接在以 nums[j]
结尾的递增子序列后面,此时 dp[i] = dp[j] + 1
。
问题二:最长连续递增子序列的长度
题目:
给定一个未经排序的整数数组,找到最长且连续递增的子序列,并返回该序列的长度。
状态定义:
dp[i] 表示以 nums[i] 结尾的最长连续递增子序列的长度。
状态转移方程:
如果 nums[i] > nums[i-1],则 dp[i] = dp[i-1] + 1;否则,重新开始计算连续递增子序列,dp[i] = 1。
动态规划解法:
我们使用 dp[i]
表示以 nums[i]
结尾的最长连续递增子序列的长度。在这个问题中,我们只需要考虑当前元素和前一个元素的关系,如果 nums[i] > nums[i-1]
,说明可以将 nums[i]
加入到连续递增子序列中,此时 dp[i] = dp[i-1] + 1
;否则,重新开始计算连续递增子序列,dp[i] = 1
。
总结:
在动态规划中,问题的性质决定了状态转移的方式。在第一个问题中,子问题的解之间存在较为复杂的依赖关系,因此需要通过两层循环来更新动态规划数组。而在第二个问题中,子问题的解之间的依赖相对简单,只与前一个状态相关,因此只需要一层循环即可。
在第一个问题中,我们需要考虑每个元素与之前所有元素的关系,因此使用两层循环。而在第二个问题中,我们只需要考虑当前元素和前一个元素的关系,因此只需要一层循环。这反映了问题性质和解决方法的差异。
__EOF__

本文链接:https://www.cnblogs.com/taixian/p/18020577.html
关于博主:计算机本科生一枚,希望从今天开始慢慢提高,一步步走向技术的高峰!
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理