HDU 2084 數塔 簡單動態規劃
阿新 • • 發佈:2017-08-29
動態 src 2-2 code .cn clas return 技術分享 space
題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=2084
題目大意:
有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?
題目分析:
首先我們可以給數塔中的每一個點制定一個坐標。
最上面的9的坐標是(1,1),第二行的12的坐標是(2,1),15的坐標是(2,2),以此類推,第i行的第j個數的坐標就是(i,j)。
我們假設一共有n行,並且設a[i][j]為坐標為(i,j)對應的數,f[i][j]為從(i,j)點走到最底層所經過的節點的數字之和的最大值。
可以得出狀態轉移方程如下:
對於第N行的節點(n,j)來說,f[n][j] = a[n][j]
對於其他行的節點(i,j)來說,f[i][j] = max(f[i+1][j], f[i+1][j+1]) + a[i][j]
C++代碼如下:
#include <cstdio> #include <iostream> using namespace std; int T, n, a[110][110], f[110][110]; int main() { scanf("%d", &T); while (T--) { scanf("%d", &n); for (int i = 1; i <= n; i ++) for (int j = 1; j <= i; j ++) scanf("%d", &a[i][j]); for (int i = 1; i <= n; i ++) f[n][i] = a[n][i]; for (int i = n-1; i >= 1; i--) for (int j = 1; j <= i; j ++) f[i][j] = max(f[i+1][j], f[i+1][j+1]) + a[i][j]; printf("%d\n", f[1][1]); } return 0; }
HDU 2084 數塔 簡單動態規劃