涉及组合的动态编程算法?

时间:2019-03-16 10:28:54

标签: java dynamic

Problem

因此该问题可以通过该算法解决

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

我无法遵循这种动态编程方法,无法摆脱迭代编程的想法。我一直想创建currentMax变量等,但这没有用。

是否可以解释这里发生的情况以及模式?

2 个答案:

答案 0 :(得分:0)

仅尝试解释此问题的性质,我希望它会随之而来-想一想,如果只有两所房屋< h1 <cost: 90>, h2 <cost: 100>>。答案是什么?一个人会去h2。这是问题的基本情况,我们将从这里扩展。扩展名-3栋房屋-<h1 <cost: 90>, h2 <cost: 100>, h3 < cost: 75>>。如果您抢劫h2,则无法抢劫<h1> and <h3>,但您想抢劫<h1> and <h3>,因为它给了您更多的钱。因此,以递归方式,在当前时间t,如果我将结果存储在变量dprecursive func(int index,int[] array)中,则可以将答案构造为dp[index]=max(arr[index]+dp[index+2],dp[index+1])。它指出,如果我抢劫ith House,那么我就无法抢劫next house,因此剩下要解决的问题是从i+2th index

答案 1 :(得分:0)

在这种模式下,它存储前一个结果中的最大值和备忘录的当前位置中num的当前值等。