题目描述
数塔就是由一堆数字组成的塔状结构,其中第一行1个数,第二行2个数,第三行3个数,依此类推。每个数都与下一层的左下与右下两个数相连接。这样从塔顶到塔底就可以有很多条路径可以走,现在需要求路径上的数字之和的最大值。
例如在上图中,5->8->12->10与5->3->16->11这两条路径上的数字之和都是35,是所有路径中的最大值。
输入描述
第一行一个正整数n(1≤n≤20),表示数塔的层数。
接下来n行为数塔从上到下的每一层,其中第层有i个正整数,每个数都不超过1000。
输出描述
从塔顶到塔底的所有路径中路径上数字之和的最大值。
样例1
输入
4
5
8 3
12 7 16
4 10 11 6
输出
35
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100;
int a[MAXN][MAXN];//二维数组
int n;
int sum_MAX(int i, int j){//树的两个分叉
if(i == n-1){//到最底层,那么这个数塔只有一个元素a[n][j],该元素就是最大值
return a[n-1][j];
}else{//否则选子树上较大的数到底层距离加上自身
return max(sum_MAX(i + 1, j),sum_MAX(i+1,j+1)) + a[i][j];
}
}
int main(){
cin >> n;
for(int i=0;i<n;i++){
for(int j=0;j<=i;j++){
cin >> a[i][j];
}
}
printf("%d",sum_MAX(0,0));//输出第一行第一列到底层的最大距离
return 0;
}