How to Paint The Houses using Minimal Costs via Dynamic Programm
- 时间:2020-09-23 15:50:46
- 分类:网络文摘
- 阅读:78 次
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 Types of Tools Every Fast-Growing E-commerce Business Should C 5 Simple Steps to Create Great Video Content for a Blog Best Practices for Blogging Securely 5 Tips to Make Sure Your Blogs Works on Every Browser Learn from Business Entrepreneurs Who Take the Time to Train Oth The Story Of Aaron Swartz And How His Death Could Change Compute Smart Finance Tips for Bloggers 8 Ways to Build Up Seed Money to Turn Your Blog into a Business Apple Reveals ARKit At WWDC Blogging From the Road: Japan Edition
- 评论列表
-
- 添加评论