动态规划-LCR 091.粉刷房子-力扣(LeetCode)

发布于:2025-05-29 ⋅ 阅读:(17) ⋅ 点赞:(0)

一、题目解析

根据题目信息,我们能知道0是红色,1是蓝色,2是绿色,由此我们就能分析如何粉刷了

二、算法原理

1、状态表示

由于只有一排房子所以此时dp[i]表示:到达i位置时,此时的最小花费,但我们发现有三种颜色要粉刷,所以我们需要多加一维表示粉刷的颜色。

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

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

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

2、状态转移方程

由于分析方式类似所以这里只给出以红色为结尾时的状态转移方程

由于最后一个为红色,所以红色是必选的,其他的则是以绿或蓝结尾的最小值

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

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

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

3、初始化

由于要用到dp[i-1][0/1/2]所以可以直接初始化dp[0][0]dp[0][1]dp[0][2],也可以加三个虚拟节点赋值为0 用于初始化,但需要注意下标的映射关系。

4、填表顺序

从左往右,三个表一起填

5、返回值

由于只粉刷一排房子,所以刷到最后一个房子三个颜色中的最小值返回即可

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

动手实现代码,才能未来助你一臂之力,链接:LCR 091. 粉刷房子 - 力扣(LeetCode)

 三、代码示例

class Solution {
public:
    int minCost(vector<vector<int>>& costs) {
        int n = costs.size();
        vector<vector<int>> dp(n+1,vector<int>(3));
        for(int i = 1;i<=n;i++)
        {
            dp[i][0]=min(dp[i-1][1],dp[i-1][2])+costs[i-1][0];//红色
            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];//绿色
        }
        return min(dp[n][0],min(dp[n][1],dp[n][2]));
    }
};

 

 

看到最后,如果对您有所帮助,还请点赞、收藏和关注,点点关注不迷路,我们下期再见!


网站公告

今日签到

点亮在社区的每一天
去签到