DP数组的容量要不要+1?
其实dp数组要不要1完全取决于“DP数组”下标代表什么。简单来说只有两种情况。我们结合“凑钱”题和经典的“爬楼梯”题来对比一下。 情况一下标代表“金额/重量/容量”需要 1场景背包问题、凑零钱、分割等和子集。例子你的目标是凑出11块钱。为什么要 1因为钱是可以为 0 的。你的记账本不仅要记录“能不能凑出 11 块”还要记录“能不能凑出 0 块”、“能不能凑出 1 块”……一直到“能不能凑出 11 块”。如果你写new int[11]下标范围是0到10。最大只能记到 10 块11 块那个格子根本不存在越界了如果你写new int[11 1]下标范围是0到11。正好能记下目标金额 11。结论只要你的下标i代表的是**“具体的数值大小”比如金额、背包重量、台阶数而且这个数值包含 0**你就必须1因为0也要占一个格子。 情况二下标代表“第几个物品/第几步”通常不用 1或者视定义而定场景爬楼梯、打家劫舍、最长递增子序列。例子给你 5 个数字[1, 5, 11, 5, 2]问最长序列是多少。为什么不用 1因为这里的下标i只是用来遍历数组的。数组本身长度是 5。我们定义dp[i]为“以第 i 个数字结尾的最长序列”。我们只需要算到dp[4]也就是最后一个数字 2就结束了。此时dp数组的大小只要和原数组一样大5就够了不需要去记录“第 5 个数字”因为根本不存在。特殊情况为了偷懒有些人在写“爬楼梯”或者“背包二维数组”时喜欢故意把数组开大一点n1是为了处理边界更方便。比如爬楼梯如果开n1你可以直接从dp[1]开始算不用管dp[0]是不是越界。但这属于“为了代码写得爽”而不是逻辑上的必须。⚖️ 一张表总结你的 dp 定义目标值数组大小原因dp[i] 能否凑出金额 i1111 1因为你要记录 0, 1, …, 11。0 也要占个座dp[i] 容量为 i 的背包最大价值10kg10 1同上容量为 0 也是一种状态。dp[i] 前 i 个物品的最优解5个物品5你只需要算到第 5 个下标 4。不需要“第 5 个”这个位置。dp[i] 跳到第 i 级台阶的方法10级10你只需要算到第 10 级下标 9。 终极判断口诀当你拿不准要不要1时问自己一个问题“我的目标值比如 11需不需要作为一个下标存进数组里”需要比如凑钱题我要查dp[11]必须 1。不需要比如数组题我只需要算到dp[n-1]不用 1。在刚才的“分割等和子集”里我们的目标是凑出target最后要返回dp[target]所以必须 1否则dp[target]就报错了
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2471535.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!