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.
简单DP,方程是d[i]=max(d[i-2]+v[i], d[i-1])
class Solution {
public:
int rob(vector<int>& nums) {
if(!nums.size()) return 0;
if(nums.size()==1) return nums[0];
vector<int> res(nums.size(), 0);
res[0]=nums[0];
res[1]=max(nums[0], nums[1]);
for(int i=2; i!=nums.size(); ++i){
res[i]=max(res[i-2]+nums[i], res[i-1]);
}
return res[nums.size()-1];
}
};
213.
After robbing those houses on that street, the thief has found himself a new place for his thievery so that he will not get too much attention. This time, all houses at this place are arranged in a circle. That means the first house is the neighbor of the last one. Meanwhile, the security system for these houses remain the same as for those in the previous street.
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-n-1, 以及1-n两个house robber问题。
本次看到了一个节省空间的办法,只需要保留上一个以及上上一个最优解即可。即pre和cur。在for循环中,一轮循环完毕后,pre为上个数字的最优解,cur为本次最优解,然后进入下一轮循环,此时cur自动变为上一轮最优解,pre同理。因此可以用于计算本轮最优解。
class Solution {
public:
int rob(vector<int>& nums) {
int n=nums.size();
if(n<2) return n?nums[0]:0;
return max(robber(nums, 0, n-1), robber(nums, 1, n));
}
int robber(vector<int>& nums, int begin, int end){
int pre=0, cur=0;
for(int i=begin; i!=end; ++i){
int temp=max(pre+nums[i], cur);
pre=cur;
cur=temp;
}
return cur;
}
};