翻转字符串
题目
这里有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题解
动态规划题,我们看第i个房子涂什么颜色,由于总共只有三种颜色,所以当第i个房子涂红色时,第i-1个房子只能涂蓝色和绿色,依次递推。只要将这三种情况得出的答案中的最小值就是最优解。可以直接利用原数组进行递推计算,无需使用额外空间。
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;
}
int m = costs.length-1;
for(int i = 1; i <= m; i++)
{
costs[i][0] += Math.min(costs[i-1][1], costs[i-1][2]);
costs[i][1] += Math.min(costs[i-1][0], costs[i-1][2]);
costs[i][2] += Math.min(costs[i-1][0], costs[i-1][1]);
}
return Math.min(Math.min(costs[m][0], costs[m][1]), costs[m][2]);
}
}
Last Update 2016.12.4