动态规划之打家劫舍 II

动态规划之打家劫舍 II,第1张

学习安排根据《代码随想录》leetcode212

思路:

看到这题的思路就是,把数组分成两部分:第一部分是 【0,nums.size()-2】,另一部分是【1,nums.size()-1】;

然后分别计算最大值,再对两个最大值再求最大值。

但是起初不知道怎么去两次dp 比较,看了会卡哥的思路,半懂,特别是说道下面这句话:

我就蒙了。

于是,看了一下官方题解,最后结合dp,写了自己的代码:

class Solution {
public:
    int maxnum(vector& nums,vector&dp,int start,int end,int m)
    {
        dp[start]=nums[start];
        dp[start+1]=max(nums[start],nums[start+1]);
        for(int i=start+2;i<=end;i++)
        {
            dp[i]=max(dp[i-1],dp[i-2]+nums[i]);
        }
        return dp[m];
    }
    int rob(vector& nums) 
    {
        if(nums.size()==0)return 0;
        else if(nums.size()==1)return nums[0];
        else if(nums.size()==2)return max(nums[0],nums[1]);
        vectordp(nums.size(),0);
      int s1= maxnum(nums,dp,0,nums.size()-2,nums.size()-2);
      int s2=maxnum(nums,dp,1,nums.size()-1,nums.size()-1);
      return max(s2,s1);
    }
};

dp作为一个函数内部的成员函数,可以通过赋值计算两种不同情况下的最大值;

注意m的参数传递!!!!

 

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/915293.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-16
下一篇2022-05-16

发表评论

登录后才能评论

评论列表(0条)

    保存