leetcode 三角形最小路徑和 動態規劃

2021-10-08 02:51:56 字數 1423 閱讀 1823

題目描述

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

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

例如,給定三角形:

[ [2],

[3,4],

[6,5,7],

[4,1,8,3]

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

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

自上而下

子狀態定義:

path[i][j] 表示從頂層到第i層的第j個節點的路徑最小路徑和

轉移函式:

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

考慮邊界情況,,即j == 0 時,path[i][0] 只能由path[i - 1][0] 轉移而來;

而當j == i時,path[i][j] 只能1由path[i - 1][i - 1]轉移而來。

自下而上:

從倒數第二層開始,修改原陣列,狀態轉移函式為:

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

class solution:

def minimumtotal(self, ********: list[list[int]]) -> int:

# 自上而下

# n = len(********)

# path = [[0] * n for _ in range(n)]

# path[0][0] = ********[0][0]

# for i in range(1, n):

# path[i][0] = path[i - 1][0] + ********[i][0]

# for j in range(1, i):

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

# path[i][i] = path[i - 1][i - 1] + ********[i][i]

# return min(path[n - 1])

# 自下而上

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

for j in range(i):

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

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

leetcode 三角形最小路徑

給定乙個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。例如,給定三角形 2 3,4 6,5,7 4,1,8,3 自頂向下的最小路徑和為11 即,2 3 5 1 11 2 5,6 11,10,13 15,11,18,16 可以看出,將最後乙個陣列的最小值選出來即可,因為最底層...

leetcode 三角形最小路徑和

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

LeetCode 三角形最小路徑和

比較直觀的想法是,使用乙個陣列來儲存每次計算路徑的最小值,這樣順序遍歷下來,最後求一遍這個陣列的最小元素就是最短路徑的值 初步認為是上面的演算法一方面最後找最小值要重新遍歷一遍,另一方面在每層遍歷時都要new乙個陣列比較佔空間 試著把最小值的計算放在迴圈裡,也沒減少耗時,說明耗時的原因不是計算最小值...