描述
这里有n
个房子在一列直线上,现在我们需要给房屋染色,共有k
种颜色。每个房屋染不同的颜色费用也不同,你希望每两个相邻的房屋颜色不同
费用通过一个n
xk
的矩阵给出,比如cost[0][0]
表示房屋0
染颜色0
的费用,cost[1][2]
表示房屋1
染颜色2
的费用。找到油漆所有房子的最低成本。
所有费用都是正整数
样例
样例1
输入:
costs = [[14,2,11],[11,14,5],[14,3,10]]
输出: 10
说明:
三个屋子分别使用第1,2,1种颜色,总花费是10。
样例2
输入:
costs = [[5]]
输出: 5
说明:
只有一种颜色,一个房子,花费为5
挑战
用O(nk)的时间复杂度解决
思路:本题只有O(nk)的时间复杂度,在考虑前n种状态的时候,必须直接找到最小值,所以可以进行一个优化。
如果当前颜色是上一个颜色的最小值,那么取次小
否则取最小
于是可以直接获取最小的值,而不用每次都进行遍历
public class Solution {
/**
* @param costs: n x k cost matrix
* @return: an integer, the minimum cost to paint all houses
*/
public int minCostII(int[][] costs) {
if(costs.length==0) return 0;
// write your code here
int m = costs.length;
int n = costs[0].length;
int[][] dp = new int[m][n];
for(int j=0;j<n;j++){
dp[0][j] = costs[0][j];
}
for(int i=1;i<m;i++){
int min = -1;
int min2 = -1;
for(int j=0;j<n;j++){
if(min==-1) min = j;
else if(dp[i-1][j]<dp[i-1][min]) min =j;
}
for(int j=0;j<n;j++){
if(j!=min){
if(min2==-1) min2 = j;
else if(dp[i-1][j]<dp[i-1][min2]) min2 =j;
}
}
System.out.println(min);
System.out.println(min2);
for(int j=0;j<n;j++){
if(j!=min) dp[i][j] = costs[i][j]+dp[i-1][min];
else dp[i][j] = costs[i][j]+dp[i-1][min2];
}
}
int res =Integer.MAX_VALUE/2;
for(int i=0;i<n;i++){
if(res>dp[m-1][i]) res = dp[m-1][i];
}
return res;
}
}