有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?
有一組測試樣例,測試例項的第一行是乙個整數n(1 <= n <= 100),表示數塔的高度,接下來用n行數字表示數塔,其中第i行有個i個整數,且所有的整數均在區間[0,99]內。
output 對於每個測試例項,輸出可能得到的最大和,每個例項的輸出佔一行。
sample input57
3 88 1 0
2 7 4 4
4 5 2 6 5
sample output
30
如果不用dp做,也是可以的,即用dfs,但是耗時耗記憶體。用dp做需要尋找狀態。
當前我們走到了第i,j處,則當前的狀態就是從i,j到最底下那層的最大節點和,這樣很容易想到初始條件是最底下那層的dp陣列就是他自己本身。
接下來我們看狀態轉移:到了i,j節點,我們有兩個選擇:1.往左下走 2.往右下走 理論上狀態轉移方程就確定了
即為 dp[i][j] = max(dp[i+1][j],dp[i+1][j+1]).但是出現了乙個問題,我並不知道dp[i+1]那層的情況。
因此結合初始條件,可以想到從底往上走。
#include#include#includeusing namespace std;
const int maxn = 100;
int dp[maxn][maxn];
int g[maxn][maxn];
int t;
int main()
}printf("%d",dp[0][0]);
return 0;
}
DP經典問題,數塔
在講述dp演算法的時候,乙個經典的例子就是數塔問題,它是這樣描述的 有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?dp問題一般都是從後向前,後文有從前向後的動態規劃 分析 因為要找到最大值的連線,我們可以從倒數第二行開始,在2時可以選擇19和7,...
DP問題之數塔問題
問題描述 考慮下面的數字金字塔,寫乙個程式來計算從最高點開始,在底部任意處結束經過的數字和最大,每一步可以走到左下和右下的點。73 8 8 1 0 2 7 4 4 4 5 2 6 5 變形後 3 8 8 1 0 2 7 4 4 4 5 2 6 5 問題分析 可以先對金字塔進行變形,如上。對於數字金字...
DP 1 數塔問題
數塔問題 基本模型 如上圖所示數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?數塔思想 自頂向下分析,自底向上計算。h i 表示第i層的最大值。要得到h i 1 則考慮上一層結點,到其相鄰節點可取得的值,取最大值作為h i 1 如果按照上述做法,從頂到底算起,...