【学会动态规划】剑指 Offer II 091. 粉刷房子(14)

简介: 【学会动态规划】剑指 Offer II 091. 粉刷房子(14)

动态规划怎么学?

学习一个算法没有捷径,更何况是学习动态规划,

跟我一起刷动态规划算法题,一起学会动态规划!

1. 题目解析

题目链接:剑指 Offer II 091. 粉刷房子 - 力扣(Leetcode)

这道题看起来挺复杂,其实题目很好理解,

我们来看第一个示例:

这里一共有三个子数组,代表的是三栋相邻的房子,

上面的数字就是刷不同颜色需要的花费金钱,

而题目要我们求的就是刷完所有房子最低的花费,

然后这里有一个条件限制,就是相邻的两个房子刷的颜色不能相同。

2. 算法原理

1. 状态表示

根据题目,我们可以得出三个状态表示:

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. 初始化

为了防止越界, 且不能让后面的值出错,

实际上填0就行了。

4. 填表顺序

从左往右,三个表同时填写

5. 返回值

返回:min( dp[ n ][ 0 ],min( dp[ n ][ 1 ],dp[ n ][ 2 ] ) )

3. 代码编写

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]));
    }   
};

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果感到有所收获的话可以给博主点一个哦。

如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~

相关文章
【动态规划刷题 6】 删除并获得点数&& 粉刷房子
【动态规划刷题 6】 删除并获得点数&& 粉刷房子
|
6月前
|
算法
【动态规划专栏】背包问题:1049. 最后一块石头的重量 II
【动态规划专栏】背包问题:1049. 最后一块石头的重量 II
56 0
|
5月前
|
算法
【洛谷 P1003】[NOIP2011 提高组] 铺地毯 题解(数组+贪心算法)
**NOIP2011 提高组问题:铺地毯** 在第一象限的颁奖典礼场地,有$n$张地毯按编号顺序铺设。需找出覆盖特定点$(x, y)$的最上方地毯编号。输入包括地毯坐标和点坐标,输出地毯编号或-1表示未覆盖。 样例:给定3张地毯,点$(2,2)$被第3张地毯覆盖,输出3;另一样例点$(4,5)$未被覆盖,输出-1。 $30\%$数据$n\leq2$,$50\%$数据坐标$\leq100$,$100\%$数据$n\leq10^4$,坐标$\leq10^5$。 解决方法:从下到上遍历地毯,更新覆盖点的地毯编号。 AC代码略。
48 0
|
6月前
蓝桥备战--分糖果OJ2928 贪心 分类讨论
蓝桥备战--分糖果OJ2928 贪心 分类讨论
65 0
|
6月前
剑指 Offer 14- I:剪绳子
剑指 Offer 14- I:剪绳子
40 0
|
6月前
剑指 Offer 14- II:剪绳子 II
剑指 Offer 14- II:剪绳子 II
31 0
|
6月前
剑指 Offer 60:n个骰子的点数
剑指 Offer 60:n个骰子的点数
46 0
|
6月前
剑指 Offer 61:扑克牌中的顺子
剑指 Offer 61:扑克牌中的顺子
32 0
|
6月前
【每日一题Day140】剑指 Offer 47. 礼物的最大价值 | 动态规划 记忆化搜索
【每日一题Day140】剑指 Offer 47. 礼物的最大价值 | 动态规划 记忆化搜索
31 0
|
C++
【LeetCode343】剪绳子(动态规划)
(1)确定状态 dp[i]是将正整数i拆成2个及其以上的正整数后,求所有数的乘积值。
140 0
【LeetCode343】剪绳子(动态规划)