看到本题,第一个想法是想要把所有的可能性算出来存入数组然后通过打擂算法求出值max可以简单的想到每一个节点都有两种可能性,这让我想到了树型结构,于是我就写了一个树来将所有可能性存入数组
#include<iostream>
using namespace std;
int o=0,a[505][505],b[9999999];
void right(long long x,int n,int z,int q);
void left(long long x,int n,int z,int q){
z=z+1;
x=x+a[z][q];
if(z==n){
b[o]=x;
o++;
}else{
left(x,n,z,q) ;
right(x,n,z,q);
}
}
void right(long long x,int n,int z,int q){
z=z+1;
q=q+1;
x=x+a[z][q];
if(z==n){
b[o]=x;
o++;
}else{
left(x,n,z,q);
right(x,n,z,q);
}}
void tree(int n,int z,int q){
long long x=a[z][q];
left(x,n,z,q);
right(x,n,z,q);
}
int main(){
int n,z=1,q=1;
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
cin>>a[i][j];
}
}
tree(n,z,q);
long long max=0;
for(int i=0;b[i]!=0;i++){
if(max<b[i]){
max=b[i];
}
}
cout<<max;
return 0;
}
但不幸的是,该方法因为时间复杂度与空间复杂度过大,不幸被RE了
于是我只能尝试动态规划根据样例所给三角形