[LeetCode] Paint House 粉刷房子
2016-03-25 14:30
417 查看
There are a row of n houses, each house can be painted with one of the three colors: red, blue or green. The cost of painting each house with a certain color is different. You have to paint all the houses such that no two adjacent houses have the same color.
The cost of painting each house with a certain color is represented by a
Note:
All costs are positive integers.
这道题说有n个房子,每个房子可以用红绿蓝三种颜色刷,每个房子的用每种颜色刷的花费都不同,限制条件是相邻的房子不能用相同的颜色来刷,现在让我们求刷完所有的房子的最低花费是多少。这题跟House Robber II和House Robber很类似,不过那题不是每个房子都抢,相邻的房子不抢,而这道题是每个房子都刷,相邻的房子不能刷同一种颜色。而Paint Fence那道题主要考察我们有多少种刷法,这几道题很类似,但都不一样,需要我们分别区分。但是它们的解题思想都一样,需要用动态规划Dynamic Programming来做,这道题我们需要维护一个二维的动态数组dp,其中dp[i][j]表示刷到第i+1房子用颜色j的最小花费,递推式为:
dp[i][j] = dp[i][j] + min(dp[i - 1][(j + 1) % 3], dp[i - 1][(j + 2) % 3]);
这个也比较好理解,如果当前的房子要用红色刷,那么上一个房子只能用绿色或蓝色来刷,那么我们要求刷到当前房子,且当前房子用红色刷的最小花费就等于当前房子用红色刷的钱加上刷到上一个房子用绿色和刷到上一个房子用蓝色的较小值,这样当我们算到最后一个房子时,我们只要取出三个累计花费的最小值即可,参见代码如下:
解法一:
由于只有红绿蓝三张颜色,所以我们就可以分别写出各种情况,这样写可能比上面的写法更加一目了然一些,更容易理解一点吧:
解法二:
类似题目:
House Robber II
House Robber
Paint Fence
参考资料:
https://leetcode.com/discuss/51721/simple-java-dp-solution
https://leetcode.com/discuss/63863/simple-15-line-code-with-o-n-time-and-o-1-memory-solution-java
LeetCode All in One 题目讲解汇总(持续更新中...)
The cost of painting each house with a certain color is represented by a
n x 3cost matrix. For example,
costs[0][0]is the cost of painting house 0 with color red;
costs[1][2]is the cost of painting house 1 with color green, and so on... Find the minimum cost to paint all houses.
Note:
All costs are positive integers.
这道题说有n个房子,每个房子可以用红绿蓝三种颜色刷,每个房子的用每种颜色刷的花费都不同,限制条件是相邻的房子不能用相同的颜色来刷,现在让我们求刷完所有的房子的最低花费是多少。这题跟House Robber II和House Robber很类似,不过那题不是每个房子都抢,相邻的房子不抢,而这道题是每个房子都刷,相邻的房子不能刷同一种颜色。而Paint Fence那道题主要考察我们有多少种刷法,这几道题很类似,但都不一样,需要我们分别区分。但是它们的解题思想都一样,需要用动态规划Dynamic Programming来做,这道题我们需要维护一个二维的动态数组dp,其中dp[i][j]表示刷到第i+1房子用颜色j的最小花费,递推式为:
dp[i][j] = dp[i][j] + min(dp[i - 1][(j + 1) % 3], dp[i - 1][(j + 2) % 3]);
这个也比较好理解,如果当前的房子要用红色刷,那么上一个房子只能用绿色或蓝色来刷,那么我们要求刷到当前房子,且当前房子用红色刷的最小花费就等于当前房子用红色刷的钱加上刷到上一个房子用绿色和刷到上一个房子用蓝色的较小值,这样当我们算到最后一个房子时,我们只要取出三个累计花费的最小值即可,参见代码如下:
解法一:
class Solution { public: int minCost(vector<vector<int>>& costs) { if (costs.empty() || costs[0].empty()) return 0; vector<vector<int>> dp = costs; for (int i = 1; i < dp.size(); ++i) { for (int j = 0; j < 3; ++j) { dp[i][j] += min(dp[i - 1][(j + 1) % 3], dp[i - 1][(j + 2) % 3]); } } return min(min(dp.back()[0], dp.back()[1]), dp.back()[2]); } };
由于只有红绿蓝三张颜色,所以我们就可以分别写出各种情况,这样写可能比上面的写法更加一目了然一些,更容易理解一点吧:
解法二:
class Solution { public: int minCost(vector<vector<int>>& costs) { if (costs.empty() || costs[0].empty()) return 0; vector<vector<int>> dp = costs; for (int i = 1; i < dp.size(); ++i) { dp[i][0] += min(dp[i - 1][1], dp[i - 1][2]); dp[i][1] += min(dp[i - 1][0], dp[i - 1][2]); dp[i][2] += min(dp[i - 1][0], dp[i - 1][1]); } return min(min(dp.back()[0], dp.back()[1]), dp.back()[2]); } };
类似题目:
House Robber II
House Robber
Paint Fence
参考资料:
https://leetcode.com/discuss/51721/simple-java-dp-solution
https://leetcode.com/discuss/63863/simple-15-line-code-with-o-n-time-and-o-1-memory-solution-java
LeetCode All in One 题目讲解汇总(持续更新中...)
相关文章推荐
- c 程序必须要从main函数开始执行么?
- HDU 1104 Remainder(BFS 同余定理)
- HDU 1104 Remainder(BFS 同余定理)
- int main(int argc,char* argv[])详解
- 软件磁盘阵列 (software RAID)的建制和mdadm命令的使用
- traits的使用
- PAT (Advanced Level) Practise 1079 Total Sales of Supply Chain (25)
- 1014. Waiting in Line (30)
- 关于刷Sylvain/burst_ind分支的一些问题解答
- WM_PAINT消息
- IPC(一)利用纯Binder通信(非aidl)
- driver.implicitly_wait(30)
- 【HushMail】如何申请HashMail免费账号
- 函数的调用规则(__cdecl,__stdcall,__fastcall,__pascal) http://blog.csdn.net/kaiwii/article/details/8500686
- 20160324 codevs 2956 排队问题,poj Ancient Cipher,uva 253 - Cube painting
- 修改参数failed_login_attempts=unlimited
- httpd基于ip、port、domain三种方式的VirtualHost
- IPC之AIDL&binder关系
- epoll_wait返回的描述符该怎么去取和用
- 人工智能:实现人工智能是是不可能的吗?