1. 问题描述
有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?
2. 问题分析
该题为典型的动态规划的题目,我们将其看成从底向上走,并动态修改上层的数值。父节点选择较大的孩子节点作为路径大的值,选了之后并将其加到自身得到的和修改本身的值。用式子表示为:
a[i][j] = max(a[i+1][j], a[i+1][j+1]) + a[i][j];其中i表示层数,j表示在某一层中的位置
3. 代码实现
#include <iostream>
#include <vector>
using namespace std;
void getMax(vector<int> a[], int h, int &max){
for(int i = h-2; i >= 0; i--){
for(int j = 0; j < (i+1); 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];
}
}
max = a[0][0];
}
int main(int argc, char *argv[])
{
int towers;
cin >> towers;
for(int t = 0; t < towers; t++){
int h ;
cin >> h;
vector<int> a[h];
for(int i = 0; i < h; i++){
vector<int> v;
for(int j = 0; j < (i+1); j++){
int num;
cin >> num;
v.push_back(num);
}
a[i] = v;
}
int max;
getMax(a, h, max);
cout << max << endl;
}
return 0;
}
4. 代码复杂度
O(n),n为节点个数,或者O(h2),h为数塔的高度













