How to Paint The Houses using Minimal Costs via Dynamic Programm
- 时间:2020-09-23 15:50:46
- 分类:网络文摘
- 阅读:136 次
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) —
推荐阅读:5 Qualities of a Blog That Makes Money How COVID-19 is Affecting Bloggers How to Hire the Right Copywriter for Your Blog 5 Blogging Tips for Off-Road Enthusiasts The Future of Work: How to Successfully Work Remotely Javascript Function to Detect Capital String Bruteforce/BackTracking Algorithm to Split Array into Fibonacci How to Avoid Paying Too Much Fee when Cashing out Bitcoin via Wi The Common Kodi Errors and Use of Free VPN for Linux Java Pattern: Use Atomic Boolean to Return Single Usage Object
- 评论列表
-
- 添加评论