How to Paint The Houses using Minimal Costs via Dynamic Programm
- 时间:2020-09-23 15:50:46
- 分类:网络文摘
- 阅读:114 次
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 n x 3 cost 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.Example:
Input: [[17,2,17],[16,16,5],[14,3,19]]
Output: 10
Explanation: Paint house 0 into blue, paint house 1 into green, paint house 2 into blue.
Minimum cost: 2 + 5 + 3 = 10.
This problem is very much alike the C/C++ Coding Exercise – House Robber – Dynamic Programming except the Dynamic Equation is slightly a bit different.
Dynamic Programming to Paint the Houses using the Minimal Costs
The DP equation is:
1 2 3 4 | f[i][0] = min(f[i - 1][1], f[i - 1][2]) + costs[i][0]; // when paint house i with color 0 f[i][1] = min(f[i - 1][2], f[i - 1][0]) + costs[i][1]; // when paint house i with color 1 f[i][2] = min(f[i - 1][0], f[i - 1][1]) + costs[i][2]; // when paint house i with color 2 Ans = min(f[j][0], f[j][1], f[j][2]); // where j is n - 1 |
f[i][0] = min(f[i - 1][1], f[i - 1][2]) + costs[i][0]; // when paint house i with color 0 f[i][1] = min(f[i - 1][2], f[i - 1][0]) + costs[i][1]; // when paint house i with color 1 f[i][2] = min(f[i - 1][0], f[i - 1][1]) + costs[i][2]; // when paint house i with color 2 Ans = min(f[j][0], f[j][1], f[j][2]); // where j is n - 1
f[i][x] is the minimal costs painting up to house i using color x. Apparently, it equals to the minimal cost of the previous houses f[i-1][y] where y is not x, plus the current cost of painting the house i with color x.
The following C++ code implements the Dynamic Programming, in O(N) time and O(N) space.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class Solution { public: int minCost(vector<vector<int>>& costs) { int n = costs.size(); if (n == 0) return 0; vector<vector<int>> f(n, vector<int>(3, INT_MAX)); f[0][0] = costs[0][0]; f[0][1] = costs[0][1]; f[0][2] = costs[0][2]; for (int i = 1; i < n; ++ i) { f[i][0] = min(f[i - 1][1], f[i - 1][2]) + costs[i][0]; f[i][1] = min(f[i - 1][2], f[i - 1][0]) + costs[i][1]; f[i][2] = min(f[i - 1][0], f[i - 1][1]) + costs[i][2]; } return min(f[n - 1][0], min(f[n - 1][1], f[n - 1][2])); } }; |
class Solution {
public:
int minCost(vector<vector<int>>& costs) {
int n = costs.size();
if (n == 0) return 0;
vector<vector<int>> f(n, vector<int>(3, INT_MAX));
f[0][0] = costs[0][0];
f[0][1] = costs[0][1];
f[0][2] = costs[0][2];
for (int i = 1; i < n; ++ i) {
f[i][0] = min(f[i - 1][1], f[i - 1][2]) + costs[i][0];
f[i][1] = min(f[i - 1][2], f[i - 1][0]) + costs[i][1];
f[i][2] = min(f[i - 1][0], f[i - 1][1]) + costs[i][2];
}
return min(f[n - 1][0], min(f[n - 1][1], f[n - 1][2]));
}
};The minimal cost will be the minimal of three different choices: painting the last house with 3 different colours.
In next post, we are going to use the same algorithm to count the permutation: Compute the Number of Ways to Paint the House via Dynamic Programming Algorithm
–EOF (The Ultimate Computing & Technology Blog) —
推荐阅读:How to use ‘Answer the Public’ to Create Unmissable Blog Posts A Guide to Handling Negative Comments and Reviews The Best Link Building Methods For Your Website How To Use Twitter To Get New Clients How to Turn Your Best Blog Posts Into Even Better Videos Why You Need Influencers for Your Brand In 2019 How to Use a Blog to Increase Ecommerce Sales Why conducting a website audit is important How to Write a Great Blog Post for a Global Audience Top Reasons Why Your Blog Sucks at Making Money (and How to Fix
- 评论列表
-
- 添加评论