这个问题十分复杂。
若考虑自上而下的方向,因为分叉只能考正下方、右下方两个数字,
导致最终的分叉只能落到一个局部分叉中,这就可能导致有些隐秘点不会被找到。
如:
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]