正序:
#include<iostream>
using namespace std;
const int N=510;
int y=-2e9;
int f[N][N];
int a[N][N];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=0;j<=i+1;j++){ //因为有负数,所以应该将两边也设为-2e9
//如果不设为-2e9在边界上会出现问题!!!!!
f[i][j]=-2e9;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++)
f[i][j]=a[i][j]+max(f[i-1][j-1],f[i-1][j]);
}
int temp=-2e9;
for(int i=1;i<=n;i++){
temp=max(temp,f[n][i]);
}
cout<<temp<<endl;
return 0;
}
逆序
代码:
#include<iostream>
using namespace std;
const int N=510;
int y=-2e9;
int f[N][N];
int a[N][N];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
cin>>a[i][j];
}
}
for(int i=n;i>=1;i--){
for(int j=1;j<=n;j++)
f[i][j]=a[i][j]+max(f[i+1][j],f[i+1][j+1]);
}
cout<<f[1][1];
}
可以看到逆序比正序更简单,不用考虑边界问题,省去另赋值为-2e9的步骤,少了一个for循环直接输出f[1][1]即可
求关注