Description
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.
Solution
DP, time O(n), space O(n)
class Solution {
public int minCost(int[][] costs) {
if (costs == null || costs.length == 0 || costs[0].length == 0) {
return 0;
}
int n = costs.length;
int[][] costSum = new int[n + 1][3];
for (int i = 0; i < n; ++i) {
costSum[i + 1][0] = costs[i][0]
+ Math.min(costSum[i][1], costSum[i][2]);
costSum[i + 1][1] = costs[i][1]
+ Math.min(costSum[i][0], costSum[i][2]);
costSum[i + 1][2] = costs[i][2]
+ Math.min(costSum[i][0], costSum[i][1]);
}
return min(costSum[n]);
}
private int min(int[] nums) {
int min = Integer.MAX_VALUE;
for (int n : nums) {
min = Math.min(n, min);
}
return min;
}
}