定义dp数组
dp[i]表示打劫前 下标为i个房子获得的最高金钱。
状态转移方程
对房子i,有抢或者不抢两种选择。
抢的话,那么说明准备抢这栋房子前,获得的钱数为dp[i-2],抢完后,获得的最高金钱为dp[i-2]+nums[i]。
不抢的话,说明此时的获得的最大钱数为dp[i-1]。
所以取两种选择的最大值:
dp[i] = max(dp[i-2]+nums[i],dp[i-1])。
同时:
若打劫下标为0的房子,则不能打劫最后一个房子。
若打劫最后一个房子,则不能打劫下标为0的房子。
求出着两种选择的最大值即可。
初始化:
dp[0] = nums[0]
dp[1] = max(nums[0],nums[1]);
class Solution {
public:
int rob(vector<int>& nums) {
int n = nums.size();
if(n==1)
return nums[0];
int r1 = help(nums,0,n-2);
int r2 = help(nums,1,n-1);
return max(r1,r2);
}
int help(vector<int>& nums, int begin, int end)
{
if(begin==end)
return nums[begin]; //为了防止只有两个元素出现的数组
int n = nums.size();
vector<int> dp(n,0);
dp[begin] = nums[begin];
dp[begin+1] = max(nums[begin],nums[begin+1]);
for(int i= begin+2;i<=end;i++)
{
dp[i] = max(dp[i-2]+nums[i],dp[i-1]);
}
return dp[end];
}
};