1. 程式人生 > >演算法-動態規劃(數字三角形)

演算法-動態規劃(數字三角形)

數字三角形問題
問題描述:給定一個由n行數字組成的數字三角形,如下圖

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

演算法設計:要求設計一個演算法,計算從三角形的頂至底的一條路徑,使該路徑經過的數字總和最大
資料輸入:輸入第一行是數字三角形的行數n,1<=n<=100,接下來是數字三角各行中的數字,所有數字在0~99之間。

#include <iostream>

using namespace std;
int a[20][20],b[20][20];
int main()
{
    int n;
    //輸入數字三角形的層數
    cin>>n;

    int s,t;
    int i,j;
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=i; j++)
        {
            cin>>a[i][j];//輸入每一層的內容
            b[i][j]=a[i][j];//用來儲存原陣列的內容
        }
    }

    for(i = n - 1; i >= 1; i --)
    {
        for(j = 1; j <= i; j ++)
        {
            if((b[i+1][j]+ b[i][j])>(b[i+1][j+1]+b[i][j]))
                b[i][j]=b[i+1][j]+ b[i][j];
            else
                b[i][j]=b[i+1][j+1]+b[i][j];


        }
    }
    //輸出最優值
    cout<<b[1][1]<<endl;

    int k=1;
    for(int i=1; i<=n; i++)
    {   
        //輸入最優解
        cout<<a[i][k]<<" ";
        if(a[i][k]+b[i+1][k]<a[i][k]+b[i+1][k+1])
        {
            k=k+1;
        }
    }

    return 0;

}



輸出:30    7 3 8 7 5