题目
这里有n个房子在一列直线上,现在我们需要给房屋染色,分别有红色蓝色和绿色。每个房屋染不同的颜色费用也不同,你需要设计一种染色方案使得相邻的房屋颜色不同,并且费用最小。
费用通过一个nx3 的矩阵给出,比如cost[0][0]表示房屋0染红色的费用,cost[1][2]表示房屋1染绿色的费用。
** 注意事项**
所有费用都是正整数
样例
costs = [[14,2,11],[11,14,5],[14,3,10]] return 10
房屋 0 蓝色, 房屋 1 绿色, 房屋 2 蓝色, 2 + 5 + 3 = 10
代码
public class Solution {
/**
* @param costs n x 3 cost matrix
* @return an integer, the minimum cost to paint all houses
*/
public int minCost(int[][] costs) {
if(costs != null && costs.length == 0) return 0;
for(int i=1;i<costs.length;i++) {
// 涂第一种颜色的话,上一个房子就不能涂第一种颜色,这样我们要在上一个房子的第二和第三个颜色的最小开销中找最小的那个加上
costs[i][0] = costs[i][0] + Math.min(costs[i-1][1], costs[i-1][2]);
// 涂第二或者第三种颜色同理
costs[i][1] = costs[i][1] + Math.min(costs[i-1][0], costs[i-1][2]);
costs[i][2] = costs[i][2] + Math.min(costs[i-1][1], costs[i-1][0]);
}
// 返回涂三种颜色中开销最小的那个
return Math.min(Math.min(costs[costs.length-1][0], costs[costs.length-1][1]), costs[costs.length-1][2]);
}
}