【每日一题】1473. 粉刷房子 III
https://leetcode-cn.com/problems/paint-house-iii/submissions/
太特么难,不会,打个卡就走!
class Solution {
// 极大值
// 选择 Integer.MAX_VALUE / 2 的原因是防止整数相加溢出
static final int INFTY = Integer.MAX_VALUE / 2;
public int minCost(int[] houses, int[][] cost, int m, int n, int target) {
// 将颜色调整为从 0 开始编号,没有被涂色标记为 -1
for (int i = 0; i < m; ++i) {
--houses[i];
}
// dp 所有元素初始化为极大值
int[][][] dp = new int[m][n][target];
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
Arrays.fill(dp[i][j], INFTY);
}
}
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (houses[i] != -1 && houses[i] != j) {
continue;
}
for (int k = 0; k < target; ++k) {
for (int j0 = 0; j0 < n; ++j0) {
if (j == j0) {
if (i == 0) {
if (k == 0) {
dp[i][j][k] = 0;
}
} else {
dp[i][j][k] = Math.min(dp[i][j][k], dp[i - 1][j][k]);
}
} else if (i > 0 && k > 0) {
dp[i][j][k] = Math.min(dp[i][j][k], dp[i - 1][j0][k - 1]);
}
}
if (dp[i][j][k] != INFTY && houses[i] == -1) {
dp[i][j][k] += cost[i][j];
}
}
}
}
int ans = INFTY;
for (int j = 0; j < n; ++j) {
ans = Math.min(ans, dp[m - 1][j][target - 1]);
}
return ans == INFTY ? -1 : ans;
}
}