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.
Note:
All costs are positive integers.
Follow up:
Could you solve it in O(nk) runtime?
1 public class Solution { 2 public int MinCostII(int[,] costs) { 3 if (costs == null || costs.GetLength(0) == 0) return 0; 4 5 int houses = costs.GetLength(0), colors = costs.GetLength(1); 6 7 var dp = new int[colors]; 8 9 for (int i = 0; i < houses; i++) 10 { 11 var tmp = new int[colors]; 12 Array.Copy(dp, tmp, colors); 13 14 for (int j = 0; j < colors; j++) 15 { 16 if (i == 0) 17 { 18 dp[j] = costs[i, j]; 19 } 20 else 21 { 22 int min = Int32.MaxValue; 23 for (int k = 0; k < colors; k++) 24 { 25 if (k != j) 26 { 27 min = Math.Min(min, tmp[k]); 28 } 29 } 30 31 dp[j] = min + costs[i, j]; 32 } 33 } 34 } 35 36 int result = Int32.MaxValue; 37 38 for (int j = 0; j < colors; j++) 39 { 40 result = Math.Min(result, dp[j]); 41 } 42 43 return result; 44 } 45 }