1. 程式人生 > >HDU 2084 數塔 簡單動態規劃

HDU 2084 數塔 簡單動態規劃

動態 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 數塔 簡單動態規劃