rt,long long 版
#include<bits/stdc++.h>
#define ll long long
#define int long long
#define il inline
#define gc getchar
using namespace std;
il ll rd(){
ll p=0,f=1; char c=gc();
while(c<'0'||c>'9'){if(c=='-') f=-1; c=gc();}
while(c>='0'&&c<='9'){p=(p<<3)+(p<<1)+(c^48); c=gc();}
return p*f;
}
ll n,m,a[1001][1001]={0},up[1001][1001]={0},dn[1001][1001]={0};
ll f[1001][1001]={0};
signed main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
n=rd(),m=rd();
memset(f,128,sizeof(f));
memset(up,128,sizeof(up));
memset(dn,128,sizeof(dn));
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
a[i][j]=rd();
}
}
//预处理第一列
f[1][1]=a[1][1];
for(int i=2;i<=n;++i){
f[i][1]=f[i-1][1]+a[i][1];
}
for(int j=2;j<=m;++j){//按列枚举
for(int i=1;i<=n;++i){
up[i][j]=max(up[i-1][j],f[i][j-1])+a[i][j];
}
for(int i=n;i>0;--i){
dn[i][j]=max(dn[i+1][j],f[i][j-1])+a[i][j];
f[i][j]=max(up[i][j],dn[i][j]);
// printf("%lld ",f[i][j]);
}
// puts("");
}
printf("%lld",f[n][m]);
return 0;
}
借鉴了第三篇题解的思路