動態規劃(實戰篇之數塔)

2022-07-27 09:30:12 字數 1135 閱讀 2755

在講述dp演算法的時候,乙個經典的例子就是數塔問題,它是這樣描述的: 

有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?

input輸入資料首先包括乙個整數c,表示測試例項的個數,每個測試例項的第一行是乙個整數n(1 <= n <= 100),表示數塔的高度,接下來用n行數字表示數塔,其中第i行有個i個整數,且所有的整數均在區間[0,99]內。 

output對於每個測試例項,輸出可能得到的最大和,每個例項的輸出佔一行。 

sample input

157

3 88 1 0

2 7 4 4

4 5 2 6 5

sample output

30
這種問題我們通常想到的是貪心法,據圖分析:9 -> 15 -> 8 -> 9 -> 10    sum = 51

可是樣例給的答案卻是59。

問題出在**呢???

根據貪心法我們每次都會選擇權值最大的路徑行走,但是我們不能確保總和 sum 是最大的。

因此自上而下找最大值不太可行,不妨我們自下而上觀察一下這張圖:三角數字塔,越往頂上走路徑越少。

正好應照了動態規劃的思想:不斷縮小區域直到找出正解。

再來看問題:從第 n - 1層看要想得到該層每個元素所經結點的最大值,要看max( a[i + 1][j]  , a[i + 1][j + 1] ),

以此類推:dp[i][j] =  max( dp[i + 1][j]  , dp[i + 1][j + 1] ) + a[i][j];

#include #include 

#include

#include

#include

using

namespace

std;

intmain()

}for(int i = n - 1; i >= 1; i--)

}cout

<< dp[1][1] <

}return0;

}

accept 

快誇我!!嘻嘻~

動態規劃 數塔

如圖所示為乙個數塔,從頂部出發在每乙個節點可以選擇向左走或向右走,一直走到最底層,要求找出一條路徑,使路徑上的數值和最大。include define n 50 int data n n d n n 定義陣列data,d int n void operate for i n 1 i 1 i else...

動態規劃 塔數

有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?輸入資料首先包括乙個整數c,表示測試例項的個數,每個測試例項的第一行是乙個整數n 1 n 100 表示數塔的高度,接下來用n行數字表示數塔,其中第i行有個i個整數,且所有的整數均在區間 0,99 內。...

數塔 動態規劃)

在講述dp演算法的時候,乙個經典的例子就是數塔問題,它是這樣描述的 有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?已經告訴你了,這是個dp的題目,你能ac嗎?input 輸入資料首先包括乙個整數c,表示測試例項的個數,每個測試例項的第一行是乙個整...