1. 程式人生 > >NOI 2.6 動態規劃 7625:三角形最佳路徑問題

NOI 2.6 動態規劃 7625:三角形最佳路徑問題

題目來源:http://noi.openjudge.cn/ch0206/7625/

7625:三角形最佳路徑問題

總時間限制1000ms    記憶體限制65536kB

描述

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

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

-----------------------------------------------------

解題思路

動態規劃

dp[i][j] =max(dp[i-1][j-1], dp[i-1][j]) + a[i][j]

-----------------------------------------------------

程式碼

#include<iostream>
#include<fstream>
using namespace std;

int main()
{
#ifndef ONLINE_JUDGE
	ifstream fin("0206_7625.txt");
	int n,i,j;
	fin >> n;
	int *dp = new int[n+1]();
	int *dp0 = new int[n+1]();
	int *a = new int[n+1]();
	for (i=1; i<=n; i++)
	{
		for (j=1; j<=i; j++)
		{
			fin >> a[j];
			if (j==1)
			{
				dp[j] = dp0[j]+a[j];
			}
			else
			{
				dp[j] = (dp0[j-1]>dp0[j]?dp0[j-1]:dp0[j])+a[j];
			}
		}
		for (j=1; j<=i; j++)
		{
			dp0[j] = dp[j];
		}
	}
	fin.close();
	int mymax = 0;
	for (i=1; i<=n; i++)
	{
		mymax = mymax>dp[i]?mymax:dp[i];
	}
	cout << mymax;
	return 0;
#endif
#ifdef ONLINE_JUDGE
	int n,i,j;
	cin >> n;
	int *dp = new int[n+1]();
	int *dp0 = new int[n+1]();
	int *a = new int[n+1]();
	for (i=1; i<=n; i++)
	{
		for (j=1; j<=i; j++)
		{
			cin >> a[j];
			if (j==1)
			{
				dp[j] = dp0[j]+a[j];
			}
			else
			{
				dp[j] = (dp0[j-1]>dp0[j]?dp0[j-1]:dp0[j])+a[j];
			}
		}
		for (j=1; j<=i; j++)
		{
			dp0[j] = dp[j];
		}
	}
	int mymax = 0;
	for (i=1; i<=n; i++)
	{
		mymax = mymax>dp[i]?mymax:dp[i];
	}
	cout << mymax;
#endif
}