数字金字塔&&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;
}