题目描述
有如下所示的数塔,要求从底层走到顶层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?
输入
输入数据首先包括一个整数整数N(1 <= N <= 100),表示数塔的高度,接下来用N行数字表示数塔,其中第i行有个i个整数,且所有的整数均在区间[0,99]内。
输出
从底层走到顶层经过的数字的最大和是多少?
样例输入
5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
样例输出
30
知识点:动态规划
代码如下:
#include<bits/stdc++.h>
using namespace std;
long long a[101][101],b[101][101];//a为初始数组,b为答案数组
int main(){
long long n;
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
b[n][i]=a[n][i];//最下面只有一种可能性,直接等于
}
for(int i=n-1;i>=1;i--){
for(int j=1;j<=i;j++){
b[i][j]=a[i][j]+max(b[i+1][j],b[i+1][j+1]);//动态转移方程
//走到第i行第j列的数 = 第i行第j列的数 + 走到第i+1行第j列的数 和 走到第i+1行第j+1列的数 的最大值
}
}
cout<<b[1][1];//输出走到最顶端的数(答案)
return 0;
}