leetcode198 打家劫舍

第一次用自己的小脑瓜写出了工地动态规划,虽然效率一般,但是至少是写出来了,每一天有两个状态,一个是今天偷,一个是今天不偷,如果今天没偷,那今天的最大收益就是昨天两种状态的最大值,如果今天偷了,那昨天肯定不能偷,所以今天收益就是昨天没偷的收益加上今天偷到的。贴代码

class Solution {
public:
    int rob(vector<int>& nums) 
    {
        if(nums.size() == 0)
        return 0;
        else if(nums.size() == 1)
        return nums[0];
        vector<vector<int>> good(nums.size(),vector<int>(2));
        good[0][0] = 0;
        good[0][1] = nums[0];
        for(int i = 1 ; i < nums.size() ; i++)
        {
            good[i][0] = max(good[i-1][0],good[i-1][1]);
            good[i][1] = good[i-1][0]+nums[i];
        }
        return max(good[nums.size()-1][0],good[nums.size()-1][1]);
};

还有一种高级动态规划,只维护与更新两个变量,分别是以当前节点前两个节点为结尾的局部最大值,而遍历这个节点时,就将second的值更新为first+本身节点值与原始second值的较大值,而first更新为原始的second值。贴代码

 1 class Solution {
 2 public:
 3     int rob(vector<int>& nums) 
 4     {
 5         if(!nums.size())
 6         return 0;
 7         int n = nums.size();
 8         if(n == 1)
 9         return nums[0];
10         int first = nums[0];
11         int second = max(first,nums[1]);
12         for(int i = 2 ; i < n ; i++)
13         {
14             int secTemp = second;
15             second = max(first+nums[i],second);
16             first = secTemp;
17         }
18         return second;
19     }
20 };

 

posted @ 2021-03-26 11:29  zhaohhhh  阅读(44)  评论(0)    收藏  举报