ACM 動態規劃 數塔

2021-07-03 17:21:52 字數 1549 閱讀 8375

hdu 2084

一、題目

在講述dp

演算法的時候,乙個經典的例子就是數塔問題,它是這樣描述的:有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?

輸入輸入資料首先包括乙個整數

c,表示測試例項的個數,每個測試例項的第一行是乙個整數

n(1 <= n <= 100)

,表示數塔的高度,接下來用

n行數字表示數塔,其中第

i行有個

i個整數,且所有的整數均在區間

[0,99]

內。輸出

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

二、思路

該題有兩種解題思路:

1.順推法

從數塔的頂部向下推,每個數(除去邊界)向上有兩個分支,比較上面兩個分支數(指的是加完後的新的數塔)的大小,哪個數大就將那個數再加到本位置上面,直到最後一層。則最大的數字之和就是最後一行中最大的那個數。

其動態規劃方程為:

f[0][0] = a[0][0];

f[i][0] = f[i-1][0]+a[i][0];

f[i][i] = f[i-1][i-1]+a[i][i];

f[i][j] = max+a[i][j];

最終答案為

max; 2.

逆推法從數塔的最低一層開始向上推,比較相鄰的兩個數(加完後的數)的大小,哪個數大就加到上一層中的那個數上面,直到加到最上面一層,則最大的數就是第一層的那個數。

其動態規劃方程為:

g[n-1][j] = a[n-1][j]  0<=j<=n-1;

g[i][j] = max+a[i][j];

最後答案為

g[0][0];

三、**實現

1.順推法

#include#define n 100

int a[n][n];

int f[n][n];

int main()

}int max = f[n - 1][0];

for(j = 1; j < n; j++) //求最大值max

if(max < f[n - 1][j]) max = f[n - 1][j];

printf("%d\n",max);

return 0;

}

2.逆推法

#include#define n 100

int a[n][n];

int g[n][n];

int main()

printf("%d",g[0][0]); //結果就是g[0][0]

return 0;

}

動態規劃 數塔

如圖所示為乙個數塔,從頂部出發在每乙個節點可以選擇向左走或向右走,一直走到最底層,要求找出一條路徑,使路徑上的數值和最大。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,表示測試例項的個數,每個測試例項的第一行是乙個整...