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

動態規劃練習一 三角形最佳路徑問題

描述

如下所示的由正整數數字構成的三角形:
7
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

思路: 求 這個 , 最大 和 , 最上邊的 那個 數 ,要選擇  ,下邊的 倆數的 最大值 , 然後 整體的 最大值 就等於 三角邊第一個數 加 下邊倆 數的 最大的那個數 , 然後 第二行的兩個數 同理 , 尋找 第三行最大的 數字 。 但是 這個樣子 從上至下 , 顯然是 不行的 , 所以 從倒數第二行 , 依次 往上 求 , a[1][1] 就是 最大 路徑和 。
#if  1                              
#include<iostream>
using namespace std;
int main()
{
	int a[105][105],n;
	cin>>n;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=i;j++)
	cin>>a[i][j];
	for(int i=n-1;i>=1;i--)
	for(int j=1;j<=i;j++)
{
	if(a[i+1][j]>=a[i+1][j+1]) a[i][j]+=a[i+1][j];
	else 
	a[i][j]+=a[i+1][j+1];
}
	
	cout<<a[1][1]<<endl;
}

#endif