#include<bits/stdc++.h>
#define int long long
using namespace std;
long long sum[1005][1005];
int n,m;
long long a[1005][1005],dp[1005][1005],pre3,pre4,t,s;
long long read() {
int f=1,x=0;
char ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') {
x=x*10+ch-'0';
ch=getchar();
}
return f*x;
}
long long maxx(long long _,long long __) {
if(_>__)return _;
return __;
}
signed main() {
// freopen("genshin.txt","r",stdin);
n=read();
m=read();
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
a[i][j]=read();
dp[j][i]=-1145141919810;
}
}
for(int i=1; i<=m; i++) {
for(int j=1; j<=n; j++) {
sum[i][j]=sum[i][j-1]+a[j][i];
}
}
for(int i=1; i<=n; i++) {
dp[1][i]=sum[1][i];
}
if(n<=300&&m<=300) {
for(int i=2; i<=m; i++) {
for(int j=1; j<=n; j++) {
for(int k=1; k<=j; k++) {
dp[i][k]=maxx(dp[i-1][j]+sum[i][j]-sum[i][k-1],dp[i][k]);
}
for(int k=j+1; k<=n; k++) {
dp[i][k]=maxx(dp[i-1][j]-sum[i][j-1]+sum[i][k],dp[i][k]);
}
}
}
}
else {
for(int i=2; i<=m; i++) {
pre3=-1145141919810;
pre4=-1145141919810;
for(int j=1; j<=n; j++) {
if(dp[i-1][j]+sum[i][j]>pre3) {
pre3=dp[i-1][j]+sum[i][j];
t=j;
}
if(dp[i-1][j]-sum[i][j-1]>pre4) {
pre4=dp[i-1][j]-sum[i][j-1];
s=j;
}
}
for(int k=1; k<=t; k++) {
dp[i][k]=maxx(pre3-sum[i][k-1],dp[i][k]);
}
for(int k=s; k<=n; k++) {
dp[i][k]=maxx(pre4+sum[i][k],dp[i][k]);
}
}
}
printf("%lld",dp[m][n]);
return 0;
}
#17 #18 #20 #21 WA
if(n<=300&&m<=300) 后跟着 n2m 的暴力。
else 后跟着 nm 的正解。