1.问题分析
原题链接:http://poj.org/problem?id=1163
本题可以抽象为求最大路径,但这种解法属于较大复杂度的解法,放在后续的解法二中进行讲解。解法一进行进一步简化,从底部向上进行计算,如下图所示:
当从下向上进行考虑时,有公式:
由于每一步都相当于是一次逆向的递归,所以可以保证单步的最大值求解一定是全局的最大值求解。
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;
}