Leetcodeブラッシングレコード-120。三角形の最小パスの合計

ここに画像の説明を挿入

この問題は非常に複雑です。
トップダウン方向を考慮すると、フォークは下と右の2つの数値しか修正できないため、
最終的なフォークは丸い部分的なフォークにしか入ることができず、一部の隠れたポイントが見つからない可能性があります。
例:
1000
999 998
997 996 995
1 994 993 992

大域的最適を検討する場合は、ボトムアップ動的計画法を検討してください。
最初に複雑な問題全体を考慮せずに、ローカル三角形の関係を見つけようとします
。3つの要素
A
BC のみを持つ三角形の
場合、DP(x、y)が(x、y)位置の最小合計として定義されている場合は、三角形2を入力します行列が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