Leetcode刷题记录——120. 三角形最小路径和

在这里插入图片描述

这个问题十分复杂。
若考虑自上而下的方向,因为分叉只能考正下方、右下方两个数字,
导致最终的分叉只能落到一个局部分叉中,这就可能导致有些隐秘点不会被找到。
如:
1000
999 998
997 996 995
1 994 993 992

若考虑全局最优,则考虑自下而上的动态规划方法。
先不考虑整个复杂问题,我们尝试求一个局部三角形的关系
如对一个仅含3个元素的三角形
A
B C
若定义DP(x,y)为(x,y)位置的最小和,输入三角形二维矩阵为a
我们以 自下而上的 方向求解
则DP(0,0) = min(DP(1,0),DP(1,1)) + a[0][0]
因为我们能确定的是:位置[I][J]的结果只和其下面的数字和其右下角的数字有关!!

class Solution:
    def __init__(self):
        self.tl = []
        self.length = 0
        self.tdict = {}
    def minimumTotal(self, triangle: List[List[int]]) -> int:
        self.tl = triangle
        self.length = len(triangle)
        if len(triangle) == 1:
            return triangle[0][0]
        else:
            return self.dp(0,0)
    def dp(self,x,y):
        if x == self.length - 1:
            return self.tl[-1][y]
        elif str(x) + '_' + str(y) in self.tdict:
            return self.tdict[str(x) + '_' + str(y)]
        else:
            res = min(self.dp(x+1,y),self.dp(x+1,y+1)) + self.tl[x][y]
            self.tdict[str(x) + '_' + str(y)] = res
            return res

将上述代码简化后得到

class Solution:
    def minimumTotal(self, triangle: List[List[int]]) -> int:
        length = len(triangle)
        for i in range(length - 1,0,-1):
            for j in range(i):
                triangle[i-1][j] += min(triangle[i][j], triangle[i][j + 1])
        return triangle[0][0] 
发布了43 篇原创文章 · 获赞 14 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_41545780/article/details/105101180