class Solution {
public:
int rob(vector<int>& nums) {
if(nums.empty())
{
return 0;
}
int size =nums.size();
if(size==1)
{
return nums[0];
}
vector<int> dp=vector<int>(size,0);
dp[0]=nums[0];
dp[1]=max(nums[1],nums[0]);
for(int i=2;i<size;i++)
{
dp[i]= max(dp[i - 2] + nums[i], dp[i - 1]);
}
return dp[size-1];
}
};
class Solution {
public:
int rob(vector<int>& nums) {
if(nums.empty())
{
return 0;
}
int size =nums.size();
if(size==1)
{
return nums[0];
}
int first=nums[0];
int second=max(nums[1],nums[0]);
for(int i=2;i<size;i++)
{
int temp= max(first + nums[i], second);
first=second;
second=temp;
}
return second;
}
};
class Solution {
public:
int robrange(vector<int>& nums,int start,int end)
{
int first=nums[start],second=max(nums[start],nums[start+1]);
for(int i=start+2;i<=end;i++)
{
int temp=second;
second=max(first+nums[i],second);
first=temp;
}
return second;
}
int rob(vector<int>& nums) {
//两种方式
//0 和 n-1 不能都去
//0->n-2 或者 1->n-1
//取到最大值
int size=nums.size();
if(size==1)
{
return nums[0];
}
if(size==2)
{
return max(nums[0],nums[1]);
}
return max(robrange(nums,0,size-2),robrange(nums,1,size-1));
}
};
class Solution {
public:
int minCost(vector<vector<int>>& costs) {
int n=costs.size();
vector<int> dp(3);
for(int j=0;j<3;j++)
{
//dp【0】-》dp【2】 分别存储着三种颜色的成本
dp[j]=costs[0][j];
}
for(int i=1;i<n;i++)
{
vector<int> dpnew(3);
for(int j=0;j<3;j++)
{
//粉刷j色 前面房子只能粉刷j+1或者j-1
dpnew[j]=min(dp[(j+1)%3],dp[(j+2)%3])+costs[i][j];
}
dp=dpnew;
}
return *min_element(dp.begin(),dp.end());
}
};