1. 程式人生 > >演算法概論week12 | leetcode.120 Triangle

演算法概論week12 | leetcode.120 Triangle

問題描述

在這裡插入圖片描述


分析

三角形具有樹形結構,這將使我們考慮遍歷演算法,如DFS。但是,如果仔細觀察,我們會發現,相鄰的節點總是共享一個“分支”。同時,假設x和y是k的“子節點”,如果已知分別從x和y到底部的最小路徑,我們就可以在O(1)的時間複雜度內確定從k開始的最小路徑。因此,就時間複雜度而言,動態規劃是解決這個問題的最佳方案。

“自底向上”的動態規劃非常簡單:我們從最下面一行的節點開始,這些節點的最小路徑和就是節點本身的值。由此,第k行第i個節點的最小路徑和將是其兩個子節點的路徑和中較小的一個加上其自身的值,即:

minpath[k][i] = min( minpath[
k+1][i], minpath[k+1][i+1]) + triangle[k][i];

因為minpath[k+1]行在計算完minpath[k]行後就沒有用到了,我們可以將minpath設定為一個一維陣列,迭代其自身:

For the kth level:
minpath[i] = min( minpath[i], minpath[i+1]) + triangle[k][i]; 

c++程式碼

class Solution {
public:
    int minimumTotal(vector<vector<int>>& triangle)
{ vector<int> min_sum(triangle.back()); for(int level = triangle.size() - 2; level >= 0; level--) { for(int i = 0; i <= level; i++) { min_sum[i] = min(min_sum[i], min_sum[i + 1]) + triangle[level][i]; } } return min_sum[
0]; } };

參考資料

DP Solution for Triangle