AcWing 3304. 数字三角形
原题链接
简单
#include<iostream>
#include<cstring>
using namespace std;
const int N=105;
int n,a[N][N];
int dp[N][N],flag[N][N];
//dp数组用于存储到达每个位置的最大路径和
//flag数组用于记录路径的偏移量
int main(){
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
cin>>a[i][j];
memset(dp,-0x3f,sizeof dp); // 将dp数组初始化为非常小的值,表示初始状态下的路径和
dp[1][1]=a[1][1]; // 杨辉三角的起始位置,路径和即为起始位置的值
flag[1][1]=0; // 起始位置的偏移量为0
for(int i=2;i<=n;i++){ // 从第二层开始遍历
for(int j=1;j<=i;j++){ // 遍历当前层的每一个元素
// 比较来自上方和左上方的路径和
if(dp[i-1][j]>dp[i-1][j-1]){
dp[i][j]=dp[i-1][j]+a[i][j]; // 更新当前元素的路径和
flag[i][j]=flag[i-1][j]-1; // 更新偏移量
}
else{
dp[i][j]=dp[i-1][j-1]+a[i][j]; // 更新当前元素的路径和
flag[i][j]=flag[i-1][j-1]+1; // 更新偏移量
}
}
}
int ans=0; // 初始化答案
for(int i=1;i<=n;i++) // 遍历最后一层的每一个元素
if(abs(flag[n][i])<=1) // 如果偏移量的绝对值不超过1
ans=max(ans,dp[n][i]); // 更新答案
cout<<ans<<endl;
return 0;
}