算法概论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

猜你喜欢

转载自blog.csdn.net/cat_xing/article/details/84678937