打家劫舍


暴力:每个房间有盗取和不盗取两种情况,类似求子集,时间复杂度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];
    }
};

猜你喜欢

转载自blog.csdn.net/qq_22080999/article/details/80849540