【python/M/120】Triangle

版权声明:小明酱私有,私自转载要捶你小胸口哦~ https://blog.csdn.net/alicelmx/article/details/82428216

题目

这里写图片描述

基本思路

这是典型的动态规划问题
我们需要做的是从三角形的最后一行开始不断向上累加最小的值,现在我们换一个角度来看我们的三角形

[
  [2],
  [3,4],
  [6,5,7],
  [4,1,8,3]
]

最后一行的元素就作为我们的dp数组,从倒数第二行的第一个元素6开始,6可以和下一行的,4,1两个数字进行相加,同时可以发现可以和他相加的这两个数字的坐标一个和6相同,一个比6的坐标大1,所以我们得出公式:

// 一般动态规划问题,公式出来了就已经全部解决了。
dp[j] = triangle[i][j] + min(dp[j], dp[j + 1])

这个相加过程可以具体理解为

// 请从下往上观看
  [11,10,10,3]
  [9,10,10,3]
  [7,6,10,3]
  [4,1,8,3]

实现代码

class Solution:
    def minimumTotal(self, triangle):
        """
        :type triangle: List[List[int]]
        :rtype: int
        """
        # 从后往前使用动态规划
        length = len(triangle)
        if length == 0:
            return 0

        dp = triangle[-1]

        for i in range(length-2,-1,-1):
            for j in range(i+1):
                dp[j] = triangle[i][j] + min(dp[j],dp[j+1])

        return dp[0]



猜你喜欢

转载自blog.csdn.net/alicelmx/article/details/82428216
今日推荐