假如有一排房子,共 n 個,每個房子可以被粉刷成紅色、藍色或者綠色這三種顏色中的一種,你需要粉刷所有的房子并且使其相鄰的兩個房子顏色不能相同。
當然,因為市場上不同顏色油漆的價格不同,所以房子粉刷成不同顏色的花費成本也是不同的。每個房子粉刷成不同顏色的花費是以一個?n x 3?的矩陣來表示的。
例如,costs[0][0] 表示第 0 號房子粉刷成紅色的成本花費;costs[1][2]?表示第 1 號房子粉刷成綠色的花費,以此類推。請你計算出粉刷完所有房子最少的花費成本。
注意:
所有花費均為正整數。
示例:
輸入: [[17,2,17],[16,16,5],[14,3,19]]
輸出: 10
解釋: 將 0 號房子粉刷成藍色,1 號房子粉刷成綠色,2 號房子粉刷成藍色。
?? ? 最少花費: 2 + 5 + 3 = 10。
思路:dp[i][0,1,2]分別代表第i個格子必須用紅、藍、綠刷的最優解。則dp[i][0]的前一個格子可以是藍或綠,也就是dp[i-1][1和dp[i-1][2]兩種情況,取最優解加上cost[i][0]即可。另兩種類似。
dp[i]只和dp[i-1]有關,所以用幾個變量記錄即可。
class Solution {public int minCost(int[][] costs) {if(costs == null || costs.length == 0) return 0;int r_cost = costs[0][0];int b_cost = costs[0][1];int g_cost = costs[0][2];for(int i = 1; i < costs.length; i++){int r_tmp = r_cost;int b_tmp = b_cost;int g_tmp = g_cost;r_cost = costs[i][0] + Math.min(b_tmp, g_tmp);b_cost = costs[i][1] + Math.min(r_tmp, g_tmp);g_cost = costs[i][2] + Math.min(r_tmp, b_tmp);}return Math.min(Math.min(r_cost, b_cost),g_cost);}
}
?