1. 程式人生 > >動態規劃練習--21(三角形最佳路徑問題)

動態規劃練習--21(三角形最佳路徑問題)

題目描述:

描述

如下所示的由正整數數字構成的三角形: 

3 8 
8 1 0 
2 7 4 4 
4 5 2 6 5 

從三角形的頂部到底部有很多條不同的路徑。對於每條路徑,把路徑上面的數加起來可以得到一個和,和最大的路徑稱為最佳路徑。你的任務就是求出最佳路徑上的數字之和。 
注意:路徑上的每一步只能從一個數走到下一層上和它最近的下邊(正下方)的數或者右邊(右下方)的數。

輸入 第一行為三角形高度100>=h>=1,同時也是最底層邊的數字的數目。
從第二行開始,每行為三角形相應行的數字,中間用空格分隔。 輸出 最佳路徑的長度數值。 樣例輸入
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
或
1
8
樣例輸出
30
或
8
題目理解:

三角形最佳路徑問題,從最上到最下最短路徑。

解題思路:

從上往下不好求,所以從下往上求。即第i行,求第i-1行到第i行最短的路徑,從而往上一步一步求,到第一行即所求結果。每個點依舊用二維陣列儲存。

原始碼:

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
    int a[102][102],b[102][102];
    int i,j,n;
    cin>>n;
    for
(i=1;i<=n;i++) for (j=1;j<=i;j++) cin>>a[i][j]; for (j=1;j<=n;j++) b[n][j]=a[n][j]; for (i=n-1;i>=1;i--) for (j=1;j<=i;j++) b[i][j]=a[i][j]+max(b[i+1][j],b[i+1][j+1]); cout<<b[1][1]<<endl; return 0; }
很典型的動態規劃問題。每一步都對下一步有影響。