この問題は非常に複雑です。
トップダウン方向を考慮すると、フォークは下と右の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]