iostream版:
#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
long long a[1005][1005],dp[1005][1005],s[1005][1005];
int main(){
cin >> n >> m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
cin >> a[i][j];
}
for(int j=1;j<=m;j++)
for(int i=1;i<=n;i++)s[i][j]=s[i-1][j]+a[i][j];
for(int i=1;i<=n;i++)dp[i][1]=s[i][1];
for(int j=2;j<=m;j++){
long long mx=dp[1][j-1];
for(int i=1;i<=n;i++){
dp[i][j]=dp[i][j-1]+a[i][j];
dp[i][j]=max(dp[i][j],mx+a[i][j]);
mx=max(mx,dp[i][j-1])+a[i][j];
}
mx=dp[n][j-1];
for(int i=n;i>=1;i--){
dp[i][j]=max(dp[i][j],mx+a[i][j]);
mx=max(mx,dp[i][j-1])+a[i][j];
}
}
cout << dp[n][m];
return 0;
}
cstdio版
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m;
long long a[1005][1005],dp[1005][1005],s[1005][1005];
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%lld",&a[i][j]);
for(int j=1;j<=m;j++)
for(int i=1;i<=n;i++)s[i][j]=s[i-1][j]+a[i][j];
for(int i=1;i<=n;i++)dp[i][1]=s[i][1];
for(int j=2;j<=m;j++){
long long mx=dp[1][j-1];
for(int i=1;i<=n;i++){
dp[i][j]=dp[i][j-1]+a[i][j];
dp[i][j]=max(dp[i][j],mx+a[i][j]);
mx=max(mx,dp[i][j-1])+a[i][j];
}
mx=dp[n][j-1];
for(int i=n;i>=1;i--){
dp[i][j]=max(dp[i][j],mx+a[i][j]);
mx=max(mx,dp[i][j-1])+a[i][j];
}
}
printf("%lld\n",dp[n][m]);
return 0;
}