넘치게 채우기
[LeetCode] 931. Minimum Falling Path Sum 본문
LeetCode - Minimum Falling Path Sum
문제 유형 : 다이나믹 프로그래밍
문제 난이도 : Medium
문제
Given an n x n array of integers matrix, return the minimum sum of any falling path through matrix.
A falling path starts at any element in the first row and chooses the element in the next row that is either directly below or diagonally left/right. Specifically, the next element from position (row, col) will be (row + 1, col - 1), (row + 1, col), or (row + 1, col + 1).
n * n의 크기의 정수 배열 matrix가 주어진다. falling path로 내려오는 길의 최소 비용을 구하여라.
falling path는 0번째 행에서 시작해서 n-1번째 행까지 대각선으로 한 칸 내려오거나 바로 내려오는 것을 말합니다.
(row, col)에서 (row+1, col-1), (row+1, col) 또는 (row+1, col+1)로 이동할 수 있다는 뜻입니다.
풀이
dp배열을 n*n으로 만들고, 1e9의 크기로 만든다.
0번째 행은 matrix의 0번째 행과 똑같이 한다. base case이기 때문이다.
1번째 행부터 n-1번째 행까지는 dp[i-1]번째 행에서부터 채워준다.
dp[i+1][j+k] = min(dp[i+1][j+k], dp[i][j] + matrix[i+1][j+k]) (단, k는 -1 ~ 1)로 점화식을 세울 수 있다.
dp의 n-1번째 행에서 가장 작은 값을 반환하면 된다.
코드
C++
static const int __ = [](){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
return 0;
}();
class Solution {
public:
int minFallingPathSum(vector<vector<int>>& matrix) {
const int n = matrix.size();
vector<vector<int>> dp(n, vector<int>(n, 1e9));
for(int i = 0; i < n; i++) {
dp[0][i] = matrix[0][i];
}
for(int i = 0; i < n-1; i++) {
for(int j = 0; j < n; j++) {
for(int k = -1; k < 2; k++) {
if(j+k < 0 || j+k >= n) continue;
dp[i+1][j+k] = min(dp[i+1][j+k], dp[i][j] + matrix[i+1][j+k]);
}
}
}
return *min_element(dp[n-1].begin(), dp[n-1].end());
}
};
'PS > LeetCode' 카테고리의 다른 글
[LeetCode] 198. House Robber (0) | 2024.01.21 |
---|---|
[LeetCode] 907. Sum of Subarray Minimums (0) | 2024.01.20 |
[LeetCode] 1207. Unique Number of Occurrences (0) | 2024.01.17 |
[LeetCode] 380. Insert Delete GetRandom O(1) (0) | 2024.01.16 |
[LeetCode] 2225. Find Players With Zero or One Losses (0) | 2024.01.15 |