对动态规划的一点总结和思考

这样来看dp数组

dp[i] 的含义是由下标 i 和 dp[] 共同构成的,先明确 下标 i ,再明确 dp[i] ,做题过程中时刻不忘他们的含义

比如 i 代表有 i 件物品,

i 套上 dp[] 后就表示 i 件物品能获得的最大利润

思考动态规划 dp 数组长度和更新 dp[i] 的方式

维度可以简单的根据有几个 for 循环遍历 dp 数组来进行划分

一维的一样

取 nums + 1 长度,就赋值 nums[1] , 返回 dp[nums.length] , 取 nums 长度,就赋值 nums[0] , 返回 dp[nums.length - 1]

  • 正常来讲我们的 dp 数组,都是 nums.length +1 的长度,因为题目取不到 0,所以这种是从 1 开始的,返回dp[nums.length]。

  • 但是如果 dp 数组长度,与 nums 的长度一样,即使题目条件范围取不到 0 ,我们也得给 dp[0] 赋值了,dp[0] 赋 dp[1] 的值,那么返回 dp[nums.length-1]

+= 和 = 作用一样,因为 dp[i] 都为 0 ,选择自己觉得最舒服的解释来用 += 和 = 就行

dp数组[0, 1, 2, 3] 和 dp数组 [1, 2, 3] 一样的,+= 和 = 也一样的

二维的不一样

常见的就是背包类型问题

dp 数组明确为 dp[i][j],可以使用滚动数组优化为 dp[i]

+= 和 = 作用不一样,因为 dp[i - 1][j] 初始值不为 0 了,+= 就只能用来求累加;= 就只能用来求最大或最小值,或者能不能凑出 target

dp 数组同样的 nums+1 的长度,dp[0] 赋值和 dp[0] 不赋值,所带来的差异将是巨大的。可以看看我的 494.目标和,对题解代码的深入理解

总结

一维就没什么好说的了,二维因为多了一个维度来遍历 dp 数组,就带来了天翻地覆的变化,在做二维问题时(比如背包问题)一定要谨慎区分 += 和 = ,背包问题数组长度无脑初始化为 bagSize + 1 就行。

对于二维问题(初始化长度为 bagSize + 1) dp[0] 赋值是一种优化??这个暂时没想明白,如果有大佬懂得话,希望能解释一下。

Guess you like

Origin blog.csdn.net/lihuabeats/article/details/121485870