暴力:每个房间有盗取和不盗取两种情况,类似求子集,时间复杂度O(2^N)
动态规划
由于同时从相邻的两个房屋中盗取会触发警报所以:
1.若选择第i个房间盗取财宝,就一定不能选择第i-1个房间盗取财宝
2.若不选择第i个房间,相当于只考虑前i-1个房间
1.确认原问题与子问题
原问题是求n个房间的最优解,子问题是求前1个房间,前2个房间.....,前n-1个房间的最优解
2.确认状态
第i个状态即为前i个房间能够获得的最大财宝(最优解)
3.确认边界状态的值
前1个房间的最优解,就是第1个房间的财宝值
前2个房间的最优解,就是第1,2个房间中较大的值
4.确定状态转移方程
a.选择第i个房间:第i个房间+前i-2个房间的最优解
b.不选择第i个房间:前i-1个房间的最优解
转移方程:dp[i] = max( dp[i-1], nums[i]+dp[i-2] ); i>=3
class Solution {
public:
int rob(vector<int>& nums) {
if(nums.size() == 0)
return 0;
if(nums.size() == 1)
return nums[0];
vector<int> dp(nums.size(),0);
dp[0] = nums[0];
dp[1] = max(nums[0],nums[1]);
for(int i = 2;i<nums.size();++i)
{
dp[i] = max(dp[i-1],nums[i]+dp[i-2]);
}
return dp[nums.size()-1];
}
};