Algorithm Leet代码:house robber,使用递归+;备忘录
我正在看这个 步骤4 迭代+备忘录(自下而上)Algorithm Leet代码:house robber,使用递归+;备忘录,algorithm,dynamic-programming,Algorithm,Dynamic Programming,我正在看这个 步骤4 迭代+备忘录(自下而上) public int-rob(int[]nums){ 如果(nums.length==0)返回0; int[]备注=新int[nums.length+1]; 备注[0]=0; 备注[1]=nums[0]; 对于(int i=1;i
public int-rob(int[]nums){
如果(nums.length==0)返回0;
int[]备注=新int[nums.length+1];
备注[0]=0;
备注[1]=nums[0];
对于(int i=1;i
问题:
是否意味着抢劫非当前房屋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)有点困惑代码>
备忘录本身并没有存储任何特定的决策。相反,它将最好的解决方案存储到i
th元素,它是。由于它被分配给memo[i+1]
,因此memo[i]
和memo[i-1]+val
之间的选择可以被认为是(i-1)
第四宫的最佳选择(因此不必抢劫i
第四宫),或者,如果我们要抢劫它,然后我们必须跳过一所房子,所以让我们把那起抢劫案加到(i-2)
第四所房子。(注意,memo[i+1]
最适合i
th家,因此memo[i-1]
最适合(i-2)
th家。这是为了方便处理第一家,这是一个边缘案例。)
这也应该给你一个关于如何理解自上而下递归的提示——同样,如果我们选择抢劫,我们需要将其添加到跳过前一个房子的最佳解决方案中。备忘录本身并没有存储任何特定的决策。相反,它将最好的解决方案存储到i
th元素,它是。由于它被分配给memo[i+1]
,因此memo[i]
和memo[i-1]+val
之间的选择可以被认为是(i-1)
第四宫的最佳选择(因此不必抢劫i
第四宫),或者,如果我们要抢劫它,然后我们必须跳过一所房子,所以让我们把那起抢劫案加到(i-2)
第四所房子。(注意,memo[i+1]
最适合i
th家,因此memo[i-1]
最适合(i-2)
th家。这是为了方便处理第一家,这是一个边缘案例。)
这也应该给你一个关于如何理解自上而下递归的提示——同样,如果我们选择rob,我们需要将其添加到跳过前一部分的最佳解决方案中
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];
}