数字金字塔&&P1216
题目
观察下面的数字金字塔。写一个程序查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以从当前点走到左下方的点也可以到达右下方的点。
题目描述
在上面的样例中,从13到8到26到15到24的路径产生了最大的和86。
【输入】
第一个行包含R(1≤R≤1000),表示行的数目。
后面每行为这个数字金字塔特定行包含的整数。
所有的被供应的整数是非负的且不大于100。
【输出】
单独的一行,包含那个可能得到的最大的和。
【输入样例】
5
13
11 8
12 7 26
6 14 15 8
12 7 13 24 11
【输出样例】
86
分析
通过某些神奇的算法,你已经成功走到了第 1 行的某一个位置,那么下一步应该怎么走呢?
显然,我们已经知道了下一步该怎么走,,而且这时,我们就可以考虑这个“神奇的算法”(dp)了。
由于第一行只有一个数,所以我们可以肯定的是,我们走到的一定是这个位置。
最后,再算出第一步该怎么走时,你就算出了这个最优路径。
代码
#include<bits/stdc++.h>//万能头
#define int long long//由于define用了int所以主函数就不能用int
using namespace std;
const int N=1e3+10;//R(1≤R≤1000)
int n;
int a[N][N];
signed main(){
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<=i;j++)
cin>>a[i][j];
}
int ans=0;
for(int i=n-2;i>=0;i--)
{
for(int j=0;j<=i;j++)
a[i][j]+=max(a[i+1][j],a[i+1][j+1]);//走这一值得最大一边
}
cout<<a[0][0]; //最优路径的结果,也就是顶点
return 0;
}