给定一个数塔,如下图所示。在此数塔中,从顶部出发,在每一节点可以选择走左下或右下,一直走到底层。请找出一条路径,使路径上的数值和最大,输出这个数值。
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
如图,是一个5行的数塔,其中7—3—8—7—5的路径经过数字和最大,为30。
输入格式说明
第一行:一个整数 n,代表数塔的高度。
接下来的 n 行:第 i 行有 i 个数字,代表数塔第 i 层上的数字。
输入样例
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出样例
30
数据范围
数塔高度:[1, 20]。数塔中的数字:[1, 100]。
解题思路:
(1)动态规划,逆序思想,找最大值;
代码:
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int n;
cin>>n;
int dp[n][n]={0}; //定义dp数组
for(int i=0;i<n;i++){
for(int j=0;j<=i;j++){
cin>>dp[i][j];
}
}
for(int i=n-2;i>=0;i--){
for(int j=0;j<=i;j++){
dp[i][j]+=max(dp[i+1][j],dp[i+1][j+1]); //状态转移方程
}
}
cout<<dp[0][0]<<endl;
return 0;
}