1. 程式人生 > >POJ 1163 The Triangle 問題解析與程式碼 解法一

POJ 1163 The Triangle 問題解析與程式碼 解法一

1.問題分析

原題連結:http://poj.org/problem?id=1163

本題可以抽象為求最大路徑,但這種解法屬於較大複雜度的解法,放在後續的解法二中進行講解。解法一進行進一步簡化,從底部向上進行計算,如下圖所示:

當從下向上進行考慮時,有公式:

M[i][j]=max(M[i][j]+M[i+1][j],M[i][j]+M[i+1][j+1])

由於每一步都相當於是一次逆向的遞迴,所以可以保證單步的最大值求解一定是全域性的最大值求解。

2.程式碼

#include <iostream>
using namespace std;

int main()
{
	int matrix[101][101];//定義一個二維矩陣

	int Nline;//輸入行總數
	cin >> Nline;

	for (int i = 1; i <= Nline; i++)//當前輸入第i行
	{
		for (int j = 1; j <= i; j++)//第i行總共又i個數
		{
			cin >> matrix[i][j];
		}
	}

	//從下向上計算,最後matrix[1][1]中存放的就是計算結果
	for (int i = Nline-1; i > 0; i--)
	{
		for (int j = 1; j <= i; j++)
		{
			matrix[i][j] = 
				(matrix[i][j] + matrix[i + 1][j] > matrix[i][j] + matrix[i + 1][j + 1]) ?
				(matrix[i][j] + matrix[i + 1][j]) : 
				(matrix[i][j] + matrix[i + 1][j + 1]);
		}
	}
	cout << matrix[1][1];
	return 0;
}