數字三角形/數塔問題(DP入門題)
阿新 • • 發佈:2018-07-22
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入門題)