因此该问题可以通过该算法解决
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变量等,但这没有用。
是否可以解释这里发生的情况以及模式?
答案 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,如果我将结果存储在变量dp
和recursive 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的当前值等。