leetcode-三角形最小路径和

 由题意可知:

1. 此题为寻找一条符合给定条件的路径问题

2. 从 “2” 开始寻找,有两条路径可供选择,“2” -> "3"  || "2" -> "4",

    从 “3” 开始寻找有两条路径可供选择 “3” -> "6" || "3"  -> "5" ,

    从 “4” 开始寻找有两条路径可供选择 "4" ->"5" || "4" -> "7"

    ......

3. 所以可能选择的路径为:

         

 可以得出,可以通过遍历所有可能的路径来得到最后的答案

...

 第2种方法:   

        就是从节点的选择上来看, 第一层节点 "2" 被选择的概率是100%, 第二层节点"3" 和 "4"被选择的概率各为50%, 所以若每一层每一个节点都有被选择的可能,我们可以自顶向下求出每一个节点被选择时的最短路径长度,举例说明:

        第二层: 若选择节点3, 那么最短路径为 2 -> 3, 路径长度为5, 若选择节点4, 那么最短路径为2 -> 4,路径长度为6.

        第三层: 若选择节点6, 那么最短路径就是 3 -> 6, 路径长度为11; 若选择节点5, 那么最短路径就是3 -> 5, 路径长度为10, 若选择节点7, 那么最短路径就为4 -> 7, 长度为13.

        第四层:若选择节点4, 那么最短路径就为 6 -> 4, 长度为15; 若选择节点1, 那么最短路径就为 5 -> 1, 长度为11; 若选择节点8, 那么最短路径就为 5 -> 8, 长度为18; 若选择节点3, 最短路径就为7 -> 3, 长度为16.

        所以可以得到最终答案为11

class Solution {
public:
    int minimumTotal(vector<vector<int>>& triangle) {
        int n = triangle.size();
        int m = triangle[n - 1].size();
        vector<vector<int>> dp(n, vector<int>(m));
        dp[0][0] = triangle[0][0];
        for (int i = 1; i < m; ++i) {
            dp[i][0] = dp[i - 1][0] + triangle[i][0];
            for (int j = 1; j < triangle[i].size() - 1; ++j) {
                dp[i][j] = min(dp[i - 1][j - 1], dp[i - 1][j]) + triangle[i][j];
            }
            dp[i][triangle[i].size() - 1] = 
            dp[i - 1][triangle[i - 1].size() - 1] + 
            triangle[i][triangle[i].size() - 1];
        }
        return *min_element(dp[n - 1].begin(), dp[n - 1].end());
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值