There are a row of n
houses, each house can be painted with one of the k
colors. 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 k
cost matrix. For example, costs[0][0]
is the cost of painting house 0
with color 0
; costs[1][2]
is the cost of painting house 1
with color 2
, and so on... Find the minimum cost to paint all houses.
Notice
All costs are positive integers.
Given n
= 3, k
= 3, costs
= [[14,2,11],[11,14,5],[14,3,10]]
return 10
house 0 is color 2, house 1 is color 3, house 2 is color 2,2 + 5 + 3 = 10
Could you solve it in O(nk)?
思路dp没的说啊, 关键是搞到O(nk);
其实对于一个颜色来说, 如果前面同色的最小值不是它的话, 就是最小值加上花费,
如果是同色的话, 前面第二小加上花费就行了, 果断O(nk)了。
class Solution {
public:
/**
* @param costs n x k cost matrix
* @return an integer, the minimum cost to paint all houses
*/
int minCostII(vector<vector<int>>& costs) {
// Write your code here
if (costs.empty()) {
return 0;
}
const int n = costs.size();
const int k = costs[0].size();
int dp[n][k];
int fir_min_val[n];
int fir_min_color[n];
int sec_min_val[n];
memset(fir_min_val, 10000, sizeof(fir_min_val));
memset(fir_min_color, -1, sizeof(fir_min_color));
memset(sec_min_val, 10000, sizeof(sec_min_val));
for (int i = 0; i < n; i++) {
if ( i == 0) {
for (int j = 0; j < k; j++) {
dp[i][j] = costs[i][j];
}
} else {
for (int j = 0; j < k; j++) {
if (j != fir_min_color[ i - 1]) {
dp[i][j] = fir_min_val[i - 1] + costs[i][j];
} else {
dp[i][j] = sec_min_val[i - 1] + costs[i][j];
}
}
}
for (int j = 0; j < k; j++) {
if (dp[i][j] < fir_min_val[i]) {
sec_min_val[i] = fir_min_val[i];
fir_min_val[i] = dp[i][j];
fir_min_color[i] = j;
} else {
if (dp[i][j] < sec_min_val[i]) {
sec_min_val[i] = dp[i][j];
}
}
}
}
return fir_min_val[n - 1];
}
};