问题描述
A robber is planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent houses have security system connected and it will automatically contact the police if two adjacent houses were broken into on the same night.
Given a list of non-negative integers representing the amount of money of each house,determine the maximum amount of money you can rob tonight without alerting the
police.
思路
类似于0,1背包问题,但是不同的是相邻的两个房子的财产不能拿,因此假设我们已经有了子问题的最优解(在前面的n-1个房子中,每抢劫一个房子我们获得的最多财产)我们考虑是否拿最后一个房子的财产,分为两种情况(1)如果拿了,那么所有的财产则等于最后一个房子的财产加上n-2个房子中获得的财产,(2)如果不拿,则总财产就等于n-1房子中获得的总财产。我们得到如下的递归式 OPT(i)=max{OPT(i-2)+Vi,OPT(i-1)}
代码
class Solution {
public:
int max(int a, int b){
return a>b? a:b;
}
int rob(vector<int>& nums) {
int length=nums.size();
if(length==0) return 0;
vector<int> ans(length,0);
ans[0]=nums[0];
ans[1]=max(nums[0],nums[1]);
if(length==1) return nums[0];
if(length==2) return ans[1];
for(int i=2;i<length;i++)
ans[i]=max(ans[i-1],ans[i-2]+nums[i]);
return ans[length-1];
}
};