动态规划--一维dp和二维dp
在解决背包问题时,使用一维动态规划数组和二维动态规划数组都是常见的方法,选择哪种方式取决于问题的特点和解法的需要。
使用一维DP数组的情况:
-
状态转移方程只涉及到上一行的元素:
- 当状态转移方程只涉及到上一行的元素时,可以使用一维DP数组。这样能够降低空间复杂度,使算法更为简洁。
-
问题中只需要考虑当前状态的前一个状态:
- 如果问题中只需要考虑当前状态和前一个状态之间的关系,而不需要考虑更远的状态,可以选择使用一维DP数组。
使用二维DP数组的情况:
-
状态转移方程涉及到上一行和当前行的元素:
- 当状态转移方程涉及到上一行和当前行的元素时,通常需要使用二维DP数组。例如,背包问题中的状态转移方程常常涉及到两个维度,一个表示物品,一个表示背包容量。
-
问题需要保留更多的信息:
- 如果问题需要保留更多的信息,可能需要使用二维DP数组来存储这些额外的信息,以便后续计算。例如,记录达到当前状态的路径、组合方式等。
-
更直观的表示状态:
- 对于一些复杂的问题,使用二维DP数组可以更直观地表示问题的状态和状态之间的关系,提高代码的可读性。
示例:
一维DP数组示例:
二维DP数组示例:
总的来说,选择使用一维DP数组还是二维DP数组,取决于问题的特点和解法的需要。在一些情况下,通过巧妙的设计,可以将二维DP数组优化成一维DP数组。
上一行和当前行的含义
在动态规划中,经常会用到“上一行”和“当前行”这两个概念,尤其是在使用二维动态规划数组时。这两者的区别在于它们对应于不同的状态或阶段。
-
上一行(Previous Row):
- 指的是当前阶段之前的一个阶段,也就是在DP数组中的上一行。
- 在二维DP数组中,通常表示为
dp[i-1][...]
,其中i
是当前行的索引。 - 上一行对应于之前的状态,用来计算当前行的状态。
-
当前行(Current Row):
- 指的是当前阶段,也就是在DP数组中的当前行。
- 在二维DP数组中,通常表示为
dp[i][...]
,其中i
是当前行的索引。 - 当前行对应于当前状态,是根据上一行的状态计算得到的。
在讨论背包问题时,这两者的具体含义可以理解为:
- 上一行: 表示考虑到当前物品之前的状态,即在选择当前物品之前的状态。
- 当前行: 表示在考虑当前物品时的状态,即在选择当前物品后的状态。
**如果 每个状态与不仅与上一行有关 改用一维dp时 要用临时变量等来防止覆盖 **
eg:https://leetcode.cn/problems/is-subsequence/
https://programmercarl.com/1143.%E6%9C%80%E9%95%BF%E5%85%AC%E5%85%B1%E5%AD%90%E5%BA%8F%E5%88%97.html#%E5%85%B6%E4%BB%96%E8%AF%AD%E8%A8%80%E7%89%88%E6%9C%AC
例题:最长公共子序列:
具体到代码中,通过这两者的概念,我们可以方便地设计状态转移方程,使用前一行的信息来更新当前行的信息,从而实现动态规划的递推过程。
__EOF__

本文作者:小苔藓
本文链接:https://www.cnblogs.com/taixian/p/18018134.html
关于博主:计算机本科生一枚,希望从今天开始慢慢提高,一步步走向技术的高峰!
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/taixian/p/18018134.html
关于博主:计算机本科生一枚,希望从今天开始慢慢提高,一步步走向技术的高峰!
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】