주어진 triangle 삼각형의 상단에서 하단까지의 최소 경로 합계를 계산하는 문제이다.
Input: triangle = [[2],[3,4],[6,5,7],[4,1,8,3]]
Output: 11
Explanation: The triangle looks like:
2
3 4
6 5 7
4 1 8 3
The minimum path sum from top to bottom is 2 + 3 + 5 + 1 = 11 (underlined above).
triangle
에 해당하는 dp 배열을 생성하고 첫번째 행은 초기화한다. 2
triangle[i]
의 처음과 끝은 그대로 triangle[i][0]
은 dp[i-1][0] + triangle[i][0]
값이고 dp[i][triangle[i].length-1]
는 dp[i-1][triangle[i-1].length-1] + triangle[i][triangle[i].length-1]
2
5 6 → 2+3, 2+4
11 ( ) 13 → 5+6, ( ), 6+7
dp[i][j]
는 min(dp[i-1][j-1], dp[i-1][j]) + triangle[i][j]
2
5 6 → 2+3, 2+4
11 10 13 → 5+6, min(5,6)+5, 6+7
/**
* @param {number[][]} triangle
* @return {number}
*/
var minimumTotal = function(triangle) {
const n = triangle.length
const dp = new Array(n)
dp[0] = triangle[0]
for (let i = 1; i < n; i++) {
dp[i] = new Array(triangle[i].length);
dp[i][0] = dp[i-1][0] + triangle[i][0];
dp[i][triangle[i].length-1] = dp[i-1][triangle[i-1].length-1] + triangle[i][triangle[i].length-1];
for (let j = 1; j < triangle[i].length-1; j++) {
dp[i][j] = Math.min(dp[i-1][j-1], dp[i-1][j]) + triangle[i][j];
}
}
return Math.min(...dp[n-1])
};