256. Paint House

선택한 UI 언어에 맞게 문제 텍스트를 러시아어에서 번역합니다. 코드는 변경하지 않습니다.

Есть ряд из 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 표시됨.

전체 채용
아직 활성 채용이 없습니다.