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

2021-10-05 00:06:31 字數 2246 閱讀 4209

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

例如,給定三角形:

[[2],

[3,4],

[6,5,7],

[4,1,8,3]

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

(1)自頂向下的動態規劃

開闢乙個與********相同的dp二維陣列。

狀態定義:dp[

i][j

]dp[i][j]

dp[i][

j]表示從頂點到第i行j列位置的最小路徑和。

**邊界:**第一行的值 就直接為其最小路徑和。

**狀態轉移方程:**三角形中某行的值,計算分三種情況:1. 首位 直接與上方元素求和 2. 末位 直接與斜上方元素求和 3. 中間位 與上方相鄰兩元素分別求和 找出其較小值 為最小路徑和。其公式:dp[

i][0

]=dp

[i−1

][0]

+tri

angl

e[i]

[0],

iϵ[1

,l

)dp[i][0]=dp[i-1][0]+********[i][0], i \epsilon [1, l)

dp[i][

0]=d

p[i−

1][0

]+tr

iang

le[i

][0]

,iϵ[

1,l)

d p[

i][j

]=mi

n(dp

[i−1

][j−

1]+t

rian

gle[

i][j

],dp

[i−1

][j]

+tri

angl

e[i]

[j])

,jϵ[

1,l−

1)

dp[i][j]=min(dp[i-1][j-1]+********[i][j],dp[i-1][j]+********[i][j]) \ , j\epsilon [1, l-1)

dp[i][

j]=m

in(d

p[i−

1][j

−1]+

tria

ngle

[i][

j],d

p[i−

1][j

]+tr

iang

le[i

][j]

),jϵ

[1,l

−1) dp[

i][i

]=dp

[i−1

][i−

1]+t

rian

gle[

i][i

]dp[i][i]=dp[i-1][i-1]+********[i][i]

dp[i][

i]=d

p[i−

1][i

−1]+

tria

ngle

[i][

i]**:

// 最小三角形的和

int minimumtotal(vector>& ********)

dp.push_back(line_v);

line_v.clear(); }

// 狀態轉移方程

for (int i = 1; i < n_line; i++)

for (int j = 0; j < i+1; j++)

// 某行 中間數值

if (j < i && j > 0)

// 某行 末位數值

if (j == i)

dp[i][j] = dp[i - 1][j - 1] + ********[i][j];

} // 找出末行最小值

vectorlast_line = dp.back();

auto min = min_element(last_line.cbegin(), last_line.cend());

return *min;

(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 為三角形的總行數 來解決這個問題,...