1. 程式人生 > 實用技巧 >LeetCode 120. 三角形最小路徑和 dp

LeetCode 120. 三角形最小路徑和 dp

地址https://leetcode-cn.com/problems/triangle/

給定一個三角形,找出自頂向下的最小路徑和每一步只能移動到下一行中相鄰的結點上。

相鄰的結點 
在這裡指的是 下標 與 上一層結點下標 相同或者等於 上一層結點下標 + 1 的兩個結點。



例如,給定三角形:

[
     [2],
    [3,4],
   [6,5,7],
  [4,1,8,3]
]
自頂向下的最小路徑和為11(即,2+3+5+1= 11)。



說明:

如果你可以只使用 O(n)的額外空間(n 為三角形的總行數)來解決這個問題,
那麼你的演算法會很加分

解法

首先思考一個問題從上到下的和 從下到上的和是一致的

那麼那種計算比較方便?

1 如果從上到下計算和,那麼第一層三角形只有一個元素,是確定的。
後面的路線有兩條,選擇哪一個還不確定
要計算出以選擇的那個元素為頂點的三角形的最小和是多少,才能知道當前應該如何選擇

2 如果從下到上計算和,三角形最低一層的數字是確定的,往上一層只要選擇下面鄰接的元素較少的那個就可以了
所以從下到上計算比較方便

class Solution {
public:

    int minimumTotal(vector<vector<int>>& triangle) {
    int m = triangle.size();
    
int n = triangle[0].size(); for (int i = m - 2; i >= 0; i--) { for (int j = 0; j < triangle[i].size(); j++) { triangle[i][j] = triangle[i][j] + min(triangle[i+1][j], triangle[i+1][j+1]); } } return triangle[0][0]; } };