DP LeetCode120 三角形最小路徑和

2021-10-05 00:27:30 字數 1383 閱讀 4432

給定乙個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。

相鄰的結點 在這裡指的是 下標 與上一層結點下標相同或者等於上一層結點下標 + 1的兩個結點。

自頂向下的最小路徑和為11(即,2+3+5+1= 11)。

如果你可以只使用 o(n) 的額外空間(n 為三角形的總行數)來解決這個問題,那麼你的演算法會很加分。

相鄰結點:與(i, j) 點相鄰的結點為 (i + 1, j) 和 (i + 1, j + 1)。

自下向上

class solution(object):

# modify the original ********, bottom-up

def minimumtotal(self, ********):

""":type ********: list[list[int]]

:rtype: int

"""if not ********:

return

for i in range(len(********) - 2, -1, -1):

for j in range(len(********[i])):

********[i][j] += min(********[i + 1][j], ********[i + 1][j + 1])

return ********[0][0]

# bottom-up, o(n) space

def minimumtotal2(self, ********):

if not ********:

return

res = ********[-1] # 轉一維res = list(********[-1])

for i in range(len(********) - 2, -1, -1):

for j in range(len(********[i])):

res[j] = min(res[j], res[j + 1]) + ********[i][j]

return res[0]

s = solution()

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

print(s.minimumtotal(********))

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

print(s.minimumtotal2(********2))

120 三角形最小路徑和

我現在知道怎麼結合遞迴和動態規劃的方法了,不需要寫出遞迴到方法。當熟練後,繼續用遞迴的方式思考問題,只不過是在腦中將其轉化為動態規劃,這道題就是例子。只不過我只寫出了n2的,對我來說我已經挺滿意了,畢竟我本地測試後oj一次性通過 阿,我知道了,他們到空間複雜的n是指每次只儲存上一行的值,還有人更雞賊...

120 三角形最小路徑和

給定乙個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。例如,給定三角形 2 3 4 6,5 7 4,1 8,3 自頂向下的最小路徑和為 11 即,2 3 5 1 11 說明 如果你可以只使用 o n 的額外空間 n 為三角形的總行數 來解決這個問題,那麼你的演算法會很加分。...

120 三角形最小路徑和

120.三角形最小路徑和 給定乙個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。例如,給定三角形 2 3,4 6,5,7 4,1,8,3 自頂向下的最小路徑和為11 即,2 3 5 1 11 說明 如果你可以只使用 o n 的額外空間 n 為三角形的總行數 來解決這個問題,...