我正在看这个讨论
步骤4
迭代+备注(自下而上)
public int rob(int[] nums) {
if (nums.length == 0) return 0;
int[] memo = new int[nums.length + 1];
memo[0] = 0;
memo[1] = nums[0];
for (int i = 1; i < nums.length; i++) {
int val = nums[i];
memo[i+1] = Math.max(memo[i], memo[i-1] + val);
}
return memo[nums.length];
}
问题:
是否memo[i]
意味着抢劫非流动房屋?
是否memo[i-1] + val
意味着抢劫当前房屋?
我正在阅读步骤3并找到以下内容:memo[i] = Math.max(rob(nums, i - 2) + nums[i], rob(nums, i - 1));
。我有点困惑memo[i+1] = Math.max(memo[i], memo[i-1] + val);
memo
本身并不存储任何特定的决定。而是将最佳解决方案存储到i
第一个元素,即动态程序的核心。由于已将其分配给memo[i+1]
,因此在memo[i]
和之间的选择memo[i-1] + val
可以被认为是最(i-1)
合适的房屋(因此不抢劫房屋i
),或者,如果我们要抢劫房屋,那么我们必须跳过房屋,所以让我们把抢劫行为加至(i-2)
屋子的尽头。(请注意,这memo[i+1]
是目前为止最好的i
房子,这memo[i-1]
也是目前为止最好的(i-2)
房子。这是为了方便处理第一间房子,这是一种边缘情况。)
这也应该给您一个提示,让您了解如何理解自上而下的递归-同样,如果我们选择抢劫,我们需要将其添加到跳过前身的最佳解决方案中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句