洛谷 P1216 数字三角形 简单的递推

在这里插入图片描述
在这里插入图片描述

Solution:

这道题的意思让我们从三角形金字塔的最高点开始找到一条到最底端最短的路径。看到这道题,可能很多人都会想从最高点开始用贪心,但是你会发现,用贪心找到的并不是最长的路径。因为贪心只能从现在的点向下取其左右相邻点的最大值,而不能保证取到下一层的最大值,所以不能找到一条最长的路径。

  • 所以我们要使用递推,从最底层向上递推。
#include<iostream>
#include<math.h>
using namespace std;

int a[1005][1005];//记录三角形原始数据
int cost[1005][1005];//记录每一点到底层的最大代价

int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){//读入数据
        for(int j=1;j<=i;j++){
            cin>>a[i][j];
            cost[i][j]=a[i][j];
        }
    }
    for(int i=n-1;i>=1;i--){//从倒数第一层开始
        for(int j=1;j<=i;j++){
            cost[i][j]=max(cost[i+1][j],cost[i+1][j+1])+a[i][j];
            //该点的代价等于该点的代价加上其下一层左右相邻的点的代价的最大值
        }
    }
    cout<<cost[1][1];//输出最高点的代价
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44123362/article/details/89301808