AcWing 898. 数字三角形
原题链接
简单
作者:
每一刻都是崭新的
,
2021-04-09 21:10:44
,
所有人可见
,
阅读 333
#include<iostream>
#include<algorithm>
using namespace std;
const int N=510;
const int INF = 0x3f3f3f3f;//最大值
int res = -INF; //找最大值,先存最小值,依次更新
int a[N][N];
int main(void)
{
int n;
cin>>n;
//正着:可以走正下方的数 右下方的数
//逆着:为找到每个数的 正上方的数 左上方的数(0,0) 所以数据从(1,1)开始
//初始化 将数据的边界值赋值为 -INF (不必全部赋值)
for(int i=0;i<=n;i++){
a[i][0] = a[i][i+1]=-INF;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
cin>>a[i][j];
}
}
//上下倒着遍历,左右没有关系
//第一行只有(1,1)一个数,上面一行都是-INF ,无比较的意义
for(int i=2;i<=n;i++){
for(int j=1;j<=i;j++){
a[i][j] += max(a[i-1][j],a[i-1][j-1]);
if(i==n) res = max(res,a[i][j]);
//必须加if 只有累加到最后一层 才在n个路径和中找最值
//不加的话,每一步大不代表最终结果就大,因为可能走不到其他路径,使其和最大
}
}
cout << res;
return 0;
}