03.06 动态规划

这篇文章展示了几个C++类Solution,它们使用动态规划方法处理数组数据。主要涉及计算序列中的最大值,如introb函数,以及计算粉刷房子的最小成本,如minCost函数,这些函数通过维护状态数组并利用前一状态信息来优化计算过程。
摘要由CSDN通过智能技术生成
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());


    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值