1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
|
#include <iostream>
#include <cmath>
using namespace std;
const int MAXLAYER = 5; // 金字塔的最大层数
/** @brief
* 计算金字塔中第layer层第pos个元素在数组中的下标
*
* @param layer int 金字塔中第layer层
* @param pos int 金字塔中第layer层第pos个元素
* @return int
*
*/
int Index(int layer, int pos)
{
return layer * (layer - 1) / 2 + pos;
}
/** @brief
* 金字塔自上而下路径中,路径和的最大值
*
* @param pNums int* 存储金字塔中的数字,这里是一维数组,按层次顺序进行存储
* @param layer int 金字塔中的第layer层[1, MAXLAYER]
* @param pos int 金字塔中第layer层的第pos([0, layer-1])个元素
* @return int 最大路径和
*
*/
int MaxPathSum(int *pNums, int layer, int pos)
{
if(MAXLAYER == layer)
{
return pNums[Index(layer, pos)];
}
/**
* 第layer层的第pos个元素,只能向第layer+1层的第pos或第pos+1个元素走
*/
return max(MaxPathSum(pNums, layer + 1, pos + 0), MaxPathSum(pNums, layer + 1, pos + 1))
+ pNums[Index(layer, pos)];
}
int main()
{
// 数组的大小应该为 MAXLAYER * (MAXLAYER + 1) / 2
int nums[] = {7, 3, 2, 8, 1, 0, 2, 7, 4, 4, 4, 5, 2 ,6, 5};
cout << MaxPathSum(nums, 1, 0) << endl;
return 0;
}
|