动态规划dp —— 14.粉刷房子

 示例一解释:

 0表示红色,1表示蓝色,2表示绿色

给的costs的每一个数组代表一个房子刷三种颜色的花费

1.状态表示

是什么?dp表中里的值所表示的含义就是状态表示

粉刷到dp[i]位置有三种情况,就是把i位置的房子刷三种颜色

dp[i][0]表示:粉刷到i位置时,最后一个位置粉刷上红色,此时的最小花费

dp[i][1]表示:粉刷到i位置时,最后一个位置粉刷上蓝色,此时的最小花费

dp[i][2]表示:粉刷到i位置时,最后一个位置粉刷上绿色,此时的最小花费

2.状态转移方程

dp[i] 等于什么

根据i位置刷不同的颜色,可分为三种情况

1.i位置刷红色

dp[i][0] = min(dp[i-1][1] , dp[i-1][2]) + costs[i][0]   

 同理可得

2.i位置刷蓝色

dp[i][1] = min(dp[i-1][0],dp[i-1][2]) + costs[i][1]

3.i位置刷绿色

dp[i][2] = min(dp[i-1][0],dp[i-1][1]) + costs[i][2]

3.初始化

保证填表的时候不越界

在表前加一个虚拟节点(多创建一个位置)然后把虚拟节点的值设置为0

4.填表顺序

为了填写当前状态的时候,所需要的状态已经计算过了

从左往右,一次填写三个表

5.返回值

题目要求+状态表示

min(dp[n][0],dp[n][1],dp[n][2])

6.代码

class Solution {
public:
    int minCost(vector<vector<int>>& costs) {
        int n = costs.size();
        //1.创建dp表
        vector<vector<int>> dp(n+1,vector<int>(3));
        //2.初始化
        //3.填表
        for(int i = 1;i < n+1;i++)
        {
            dp[i][0] = min(dp[i-1][1],dp[i-1][2]) + costs[i-1][0];
            //计算costs[i]位置要i-1因为有虚拟节点
            dp[i][1] = min(dp[i-1][0],dp[i-1][2]) + costs[i-1][1];
            dp[i][2] = min(dp[i-1][0],dp[i-1][1]) + costs[i-1][2];
        }
        //4.返回值
        return min(dp[n][0],min(dp[n][1],dp[n][2]));
    }
};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值