1258:【例9.2】数字金字塔
1258:【例9.2】数字金字塔
【题目描述】
观察下面的数字金字塔。写一个程序查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以从当前点走到左下方的点也可以到达右下方的点。

在上面的样例中,从1313到88到2626到1515到2424的路径产生了最大的和8686。
【输入】
第一个行包含R(1≤R≤1000)R(1≤R≤1000),表示行的数目。
后面每行为这个数字金字塔特定行包含的整数。
所有的被供应的整数是非负的且不大于100100。
【输出】
单独的一行,包含那个可能得到的最大的和。
【输入样例】
5 13 11 8 12 7 26 6 14 15 8 12 7 13 24 11
【输出样例】
86
这道题用了动态规划。最底下几个数自身就是从他们开始的最大和,所以
for(int i=1;i<=n;i++) MAXSUM[n][i]=d[n][i];
而其他每个数的最大和就等于下面和右下方的值取最大值再加上他本身
for(int i=n-1;i>=1;i--){ for(int j=1;j<=i;j++) MAXSUM[i][j]=max(MAXSUM[i+1][j],MAXSUM[i+1][j+1])+d[i][j]; }
最后输出就行了。
AC代码:
#include<bits/stdc++.h> using namespace std; long long n,MAXSUM[1010][1010],d[1010][1010]; int main(){ cin>>n; for(int i=1;i<=n;i++){ for(int j=1;j<=i;j++) cin>>d[i][j]; } for(int i=1;i<=n;i++) MAXSUM[n][i]=d[n][i]; for(int i=n-1;i>=1;i--){ for(int j=1;j<=i;j++) MAXSUM[i][j]=max(MAXSUM[i+1][j],MAXSUM[i+1][j+1])+d[i][j]; } cout<<MAXSUM[1][1]; return 0; }

浙公网安备 33010602011771号