How to Paint The Houses using Minimal Costs via Dynamic Programm
- 时间:2020-09-23 15:50:46
- 分类:网络文摘
- 阅读:70 次
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) —
推荐阅读:找不到一个人代替你 来吧,我是北方 什么是优角 兔子问题 三阶幻方 闰年计算方法 周长和面积有什么不同 年月日有哪些重要的知识 闰年和平年怎么判断 常用的数学英语单词
- 评论列表
-
- 添加评论