數字三角形問題
標籤: 動態規劃 雜談分類: 演算法設計
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行數字組成的數字三角形,計算從三角形的頂至底的路徑經過的數字和的最大...