zoukankan      html  css  js  c++  java
  • leetcode120:三角形最小路径和

    给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。

    相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。 

    例如,给定三角形:

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

    说明:

    如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。


    ================================================Python==========================================

    class Solution:
        def minimumTotal(self, triangle: List[List[int]]) -> int:
            dp = [[float("inf") for _ in range(len(triangle[-1]))] for i in range(len(triangle))]
            res = float("inf")
            dp[0][0] = triangle[0][0]
            for i in range(1, len(triangle)):
                for j in range(min(i+1, len(triangle[-1]))):
                    if j == 0:
                        dp[i][j] = dp[i-1][j] + triangle[i][j]
                    else:
                        dp[i][j] = min(dp[i-1][j], dp[i-1][j-1]) + triangle[i][j]
            return min(dp[-1])

    ==============================================Go====================================================

    func minimumTotal(triangle [][]int) int {
        if len(triangle) < 1 {
            return 0
        }
        if len(triangle) == 1 {
            return triangle[0][0]
        }
        dp := make([][]int, len(triangle))
        for i, arr := range triangle {
            dp[i] = make([]int, len(arr))
        }
        result := 1 << 31 - 1
        dp[0][0] = triangle[0][0]
        dp[1][1] = triangle[1][1] + triangle[0][0]
        dp[1][0] = triangle[1][0] + triangle[0][0]
        for i := 2; i < len(triangle); i++ {
            for j := 0; j < len(triangle[i]); j++ {
                if j == 0{
                    dp[i][j] = dp[i-1][j] + triangle[i][j]
                } else if j == (len(triangle[i]) - 1) {
                    dp[i][j] = dp[i-1][j-1] + triangle[i][j]
                } else {
                    dp[i][j] = min(dp[i-1][j-1], dp[i-1][j]) + triangle[i][j]
                }
            }
        }
    
        for _, k := range dp[len(dp) - 1] {
            result = min(result, k)
        }
        return result
    }
    
    func min(a, b int) int {
        if a > b {
            return b
        }
        return a
    }
  • 相关阅读:
    Gym
    HDU 5876 Sparse Graph(补图中求最短路)
    HDU 5873 Football Games(竞赛图兰道定理)
    HDU 5877 Weak Pair(树状数组+dfs+离散化)
    HDU 5963 朋友(找规律博弈)
    HDU 5961 传递
    POJ 3252 Round Numbers(数位dp)
    HDU 4734 F(x) (数位dp)
    HDU 2089 不要62(数位dp模板题)
    HDU 5936 Difference(折半搜索(中途相遇法))
  • 原文地址:https://www.cnblogs.com/liushoudong/p/13512331.html
Copyright © 2011-2022 走看看