Есть ряд из n домов, где каждый дом можно покрасить в один из трёх цветов: красный, синий или зелёный. Стоимость покраски каждого дома в определённый цвет разная. Необходимо покрасить все дома так, чтобы никакие два соседних дома не были окрашены в один и тот же цвет.
Стоимость покраски каждого дома в определённый цвет представлена в виде матрицы стоимости n x 3.
На示例, costs[0][0] — это стоимость покраски дома 0 в красный цвет; costs[1][2] — это стоимость покраски дома 1 в зелёный цвет и так далее...
return минимальную стоимость покраски всех домов.
示例:
Input: costs = [[17,2,17],[16,16,5],[14,3,19]]
Output: 10
Explanation: Paint house 0 into blue, paint house 1 into green, paint house 2 into blue.
Minimum cost: 2 + 5 + 3 = 10.
C# 解法
匹配/原始public class Solution {
public int MinCost(int[][] costs) {
int n = costs.Length;
int[,] dp = new int[n, 3];
for (int j = 0; j < 3; j++) dp[0, j] = costs[0][j];
for (int i = 1; i < n; i++) {
dp[i, 0] = costs[i][0] + Math.Min(dp[i-1, 1], dp[i-1, 2]);
dp[i, 1] = costs[i][1] + Math.Min(dp[i-1, 0], dp[i-1, 2]);
dp[i, 2] = costs[i][2] + Math.Min(dp[i-1, 0], dp[i-1, 1]);
}
return Math.Min(dp[n-1, 0], Math.Min(dp[n-1, 1], dp[n-1, 2]));
}
}
C++ 解法
自动草稿,提交前请检查#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
public int MinCost(int[][] costs) {
int n = costs.size();
int[,] dp = new int[n, 3];
for (int j = 0; j < 3; j++) dp[0, j] = costs[0][j];
for (int i = 1; i < n; i++) {
dp[i, 0] = costs[i][0] + min(dp[i-1, 1], dp[i-1, 2]);
dp[i, 1] = costs[i][1] + min(dp[i-1, 0], dp[i-1, 2]);
dp[i, 2] = costs[i][2] + min(dp[i-1, 0], dp[i-1, 1]);
}
return min(dp[n-1, 0], min(dp[n-1, 1], dp[n-1, 2]));
}
}
Java 解法
匹配/原始class Solution {
public int minCost(int[][] costs) {
int n = costs.length;
int[][] dp = new int[n][3];
dp[0] = costs[0].clone();
for (int i = 1; i < n; i++) {
dp[i][0] = costs[i][0] + Math.min(dp[i-1][1], dp[i-1][2]);
dp[i][1] = costs[i][1] + Math.min(dp[i-1][0], dp[i-1][2]);
dp[i][2] = costs[i][2] + Math.min(dp[i-1][0], dp[i-1][1]);
}
return Math.min(dp[n-1][0], Math.min(dp[n-1][1], dp[n-1][2]));
}
}
JavaScript 解法
匹配/原始class Solution {
minCost(costs) {
const n = costs.length;
const dp = Array.from({ length: n }, () => Array(3).fill(0));
dp[0] = costs[0].slice();
for (let i = 1; i < n; i++) {
dp[i][0] = costs[i][0] + Math.min(dp[i-1][1], dp[i-1][2]);
dp[i][1] = costs[i][1] + Math.min(dp[i-1][0], dp[i-1][2]);
dp[i][2] = costs[i][2] + Math.min(dp[i-1][0], dp[i-1][1]);
}
return Math.min(dp[n-1][0], dp[n-1][1], dp[n-1][2]);
}
}
Python 解法
匹配/原始class Solution:
def minCost(self, costs: List[List[int]]) -> int:
n = len(costs)
dp = [[0] * 3 for _ in range(n)]
dp[0] = costs[0]
for i in range(1, n):
dp[i][0] = costs[i][0] + min(dp[i-1][1], dp[i-1][2])
dp[i][1] = costs[i][1] + min(dp[i-1][0], dp[i-1][2])
dp[i][2] = costs[i][2] + min(dp[i-1][0], dp[i-1][1])
return min(dp[n-1][0], dp[n-1][1], dp[n-1][2])
Go 解法
匹配/原始func minCost(costs [][]int) int {
n := len(costs)
dp := make([][3]int, n)
dp[0] = [3]int{costs[0][0], costs[0][1], costs[0][2]}
for i := 1; i < n; i++ {
dp[i][0] = costs[i][0] + min(dp[i-1][1], dp[i-1][2])
dp[i][1] = costs[i][1] + min(dp[i-1][0], dp[i-1][2])
dp[i][2] = costs[i][2] + min(dp[i-1][0], dp[i-1][1])
}
return min(dp[n-1][0], dp[n-1][1], dp[n-1][2])
}
func min(a, b int) int {
if a < b {
return a
}
return b
}
Algorithm
1️⃣
Инициализируйте 数组 dp размера n x 3 для хранения минимальных затрат на покраску домов. Установите начальные значения для первого дома: dp[0][0] = costs[0][0], dp[0][1] = costs[0][1], dp[0][2] = costs[0][2].
2️⃣
Для каждого дома i от 1 до n-1 обновите значения 数组а dp:
dp[i][0] = costs[i][0] + min(dp[i-1][1], dp[i-1][2])
dp[i][1] = costs[i][1] + min(dp[i-1][0], dp[i-1][2])
dp[i][2] = costs[i][2] + min(dp[i-1][0], dp[i-1][1])
3️⃣
return минимальное значение из последней строки 数组а dp: min(dp[n-1][0], dp[n-1][1], dp[n-1][2]).
😎
Vacancies for this task
活跃职位 with overlapping task tags are 已显示.