數字三角形問題

2021-06-06 14:30:49 字數 1051 閱讀 6301

數字三角形問題 

標籤: 動態規劃 雜談分類: 演算法設計

34   5

11  9   8

15   21  13   4

這是乙個數字三角形。請編乙個程式計算從頂至底的某處的一條路徑,使該路徑所經過的數字的總和最大。

●每一步可沿左斜線向下或右斜線向下走;

●1<三角形行數≤200;

●三角形中的數字為整數0,1,…99;

[輸入格式] :

第1行n,表示n行 <=25 ,2到n+1行為每個的權值。

[輸出格式]:

最大值輸入樣例:43

4 511 9 8

15 21 13 24

輸出樣例:

40分析如下:

只要對該題稍加分析,就可以得出乙個結論:

如果得到一條由頂至底的某處的一條最佳路徑,那麼對於該路徑上的每乙個中間點來說,由頂至該中間點的路徑所經過的數字和也為最大。因此該題是乙個典型的多階段決策最優化的問題。

我們採用動態規劃中的順推解法。按三角形的行劃分階段。若行數為n, 則可把問題看

作乙個n-1個階段的決策問題。從始點出發,依順向求出第一階段、第二階段,……,第n-1

階段中各決策點至始點的最佳路徑,最終求出始點到終點的最佳路徑。

用二維陣列f[i][j]表示第i行的第j個數能得到的最大值,不難寫出下列狀態轉移方程:

f[i][j]=max+map[i][j]//map為權值陣列

但要注意的是,

每行第乙個只能選擇上一行的第乙個,即:

f[i][1]=f[i-1][1]+map[i][1];

每行最後乙個也只能選擇上一行的最後乙個,即:

f[i][i]=f[i-1][i-1]+map[i][i];

#include

using namespace std;

int f[201][201];

int main()

int mx=0;

for(j=1;j<=n;j++)

if(f[n][j]>mx)

mx=f[n][j];

cout<

數字三角形問題

給定乙個由n行數字組成的數字三角形,設計乙個演算法,計算出從三角形的頂至底的一條路徑,使該路徑經過的數字總和最大。0,0 1,0 1,1 2,0 2,1 2,2 3,0 3,1 3,2 3,3 思路 動態規劃 動態方程 sum i,j a i,j max sum i,j 表示從 i,j 出發時能得到...

數字三角形問題

time limit 1000ms memory limit 65536k 給定乙個由n行數字組成的數字三角形如下圖所示。試設計乙個演算法,計算出從三角形的頂至底的一條路徑,使該路徑經過的數字總和最大。對於給定的由n行數字組成的數字三角形,計算從三角形的頂至底的路徑經過的數字和的最大值。輸入資料的第...

數字三角形問題

time limit 1000ms memory limit 65536k 有疑問?點這裡 給定乙個由n行數字組成的數字三角形如下圖所示。試設計乙個演算法,計算出從三角形的頂至底的一條路徑,使該路徑經過的數字總和最大。對於給定的由n行數字組成的數字三角形,計算從三角形的頂至底的路徑經過的數字和的最大...