题中提到“最高金额”,即求最优解代价。贪心策略和动态规划都可用于求解最优解问题。此问题是动态规划问题。
注意初始化时要考虑dp[0],dp[1]等数组越界问题
class Solution {
//动态规划
public int rob(int[] nums) {
int len = nums.length;
int[] dp = new int[len+1];
dp[0] = 0;
if(len == 0){
return dp[0];
}
dp[1] = nums[0];
if(len == 1){
return dp[1];
}
dp[2] = Math.max(nums[0],nums[1]);
for(int i = 3;i<=len;i++){
//需要判断当前已“打劫”的是否有末尾住户i
if(dp[i-2] == dp[i-1]){
//不包括末尾元素
dp[i] = dp[i-1] + nums[i-1];
}
if(dp[i-2] < dp[i-1]){
//包括了末尾元素
dp[i] = Math.max(dp[i-2]+nums[i-1],dp[i-1]);
}
}
return dp[len];
}
}