題目地址:
https://leetcode.com/problems/paint-house/
給定一個二維數組,第行代表房子用顏色刷漆需要的費用。要求相鄰的房子不能刷同樣顏色的漆。問粉刷所有的房子需要的最小費用是多少。
思路是動態規劃。令表示第個房子用第種漆刷的情況下,第刷漆的總費用。那麼有最終結果就是數組的最後一行的最小值。初始條件就是第一個房子對應的費用向量。
由於我們發現,只取決於前一行,所以爲了節省空間,可以用滾動數組。代碼如下:
public class Solution {
public int minCost(int[][] costs) {
if (costs == null || costs.length == 0 || costs[0].length == 0) {
return 0;
}
int[][] dp = new int[2][3];
// 初始化
for (int i = 0; i < 3; i++) {
dp[0][i] = costs[0][i];
}
// cur代表當前需要更新的行的座標
int cur = 0;
for (int i = 1; i < costs.length; i++) {
// 滾動一下
cur ^= 1;
for (int j = 0; j < 3; j++) {
dp[cur][j] = costs[i][j] + Math.min(dp[cur ^ 1][(j + 1) % 3], dp[cur ^ 1][(j + 2) % 3]);
}
}
int res = Integer.MAX_VALUE;
for (int i = 0; i < 3; i++) {
res = Math.min(res, dp[cur][i]);
}
return res;
}
}
時間複雜度,空間複雜度。