1. 程式人生 > >數字三角形/數塔問題(DP入門題)

數字三角形/數塔問題(DP入門題)

cstring scan iostream 動態規劃 bubuko 規劃 pri 技術分享 輸入

有形如下圖所示的數塔,從頂部出發,在每一結點可以選擇向左走或是向右走,一起走到底層,要求找出一條路徑,使路徑上的值最大。

技術分享圖片

樣例輸入:

5

13

11 8

12 7 26

6 14 15 8

12 7 13 24 11

樣例輸出:

86(13->8->26->15->24)

#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 105
using namespace std;
int n;
int a[maxn][maxn]; 
int dp[maxn][maxn];   //自底向上,記錄從點(i,j)出發到數塔底層的路徑最大和 
int main()
{
    int i,j;
    scanf("%d",&n);
    for(i=0;i<n;i++)
        for(j=0;j<=i;j++)
            scanf("%d",&a[i][j]);
    memset(dp,0,sizeof(dp));
    for(i=0;i<n;i++)  //填數塔最底層
        dp[n-1][i]=a[n-1][i];
    for(i=n-2;i>=0;i--)   //更新除數塔最底層外的各個點的路徑最大和 
        for(j=0;j<=i;j++)
            dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+a[i][j];
    printf("%d\n",dp[0][0]);
    return 0;
}

註釋:最簡單的動態規劃題(DP)還是沒想出來怎麽做,
這個題只要求要最大的數,所有需要自低向上計算每一個DP[i][j]的最大值一直到DP[0][0]就是最後的答案

狀態轉移方程:dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+a[i][j];

數字三角形/數塔問題(DP入門題)