Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm Leet代码:house robber,使用递归+;备忘录_Algorithm_Dynamic Programming - Fatal编程技术网

Algorithm Leet代码:house robber,使用递归+;备忘录

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

我正在看这个

步骤4

迭代+备忘录(自下而上)

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];
}