学习安排根据《代码随想录》leetcode212
思路:
看到这题的思路就是,把数组分成两部分:第一部分是 【0,nums.size()-2】,另一部分是【1,nums.size()-1】;
然后分别计算最大值,再对两个最大值再求最大值。
但是起初不知道怎么去两次dp 比较,看了会卡哥的思路,半懂,特别是说道下面这句话:
我就蒙了。
于是,看了一下官方题解,最后结合dp,写了自己的代码:
class Solution {
public:
int maxnum(vector<int>& nums,vector<int>&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<int>& 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]);
vector<int>dp(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的参数传递!!!!