1. 程式人生 > 其它 >1258:【例9.2】數字金字塔

1258:【例9.2】數字金字塔

 

1258:【例9.2】數字金字塔

原題連結

【題目描述】

觀察下面的數字金字塔。寫一個程式查詢從最高點到底部任意處結束的路徑,使路徑經過數字的和最大。每一步可以從當前點走到左下方的點也可以到達右下方的點。

在上面的樣例中,從1313到88到2626到1515到2424的路徑產生了最大的和8686。

【輸入】

第一個行包含R(1R1000)R(1≤R≤1000),表示行的數目。

後面每行為這個數字金字塔特定行包含的整數。

所有的被供應的整數是非負的且不大於100100。

【輸出】

單獨的一行,包含那個可能得到的最大的和。

【輸入樣例】

5
13
11 8
12 7  26
6  14 15 8
12 7  13 24 11

【輸出樣例】

86

這道題用了動態規劃。最底下幾個數自身就是從他們開始的最大和,所以
for(int i=1;i<=n;i++) MAXSUM[n][i]=d[n][i];

而其他每個數的最大和就等於下面和右下方的值取最大值再加上他本身

for(int i=n-1;i>=1;i--){
        for(int j=1;j<=i;j++) MAXSUM[i][j]=max(MAXSUM[i+1][j],MAXSUM[i+1][j+1])+d[i][j];
    }

最後輸出就行了。

AC程式碼:

#include<bits/stdc++.h>
using
namespace std; long long n,MAXSUM[1010][1010],d[1010][1010]; int main(){ cin>>n; for(int i=1;i<=n;i++){ for(int j=1;j<=i;j++) cin>>d[i][j]; } for(int i=1;i<=n;i++) MAXSUM[n][i]=d[n][i]; for(int i=n-1;i>=1;i--){ for(int j=1;j<=i;j++) MAXSUM[i][j]=max(MAXSUM[i+1
][j],MAXSUM[i+1][j+1])+d[i][j]; } cout<<MAXSUM[1][1]; return 0; }