矩阵压缩
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&x);
a[i][j]=a[i-1][j]+x;
}
}
for(int i=1;i<=n;i++){
for(int k=1;k<=i;k++){
int f[N]={0},dp[N]={0};
for(int j=1;j<=n;j++){
f[j]=a[i][j]-a[i-k][j];
dp[j]=max(dp[j-1]+f[j],f[j]);
ans=max(dp[j],ans);
}
}
}
printf("%d\n",ans);
}
二维前缀和
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&x);
a[i][j]=a[i][j-1]+x;
sum[i][j]=sum[i-1][j]+a[i][j];
}
}
for(int x1=1;x1<=n;x1++){
for(int x2=1;x2<=n;x2++){
for(int y3=1;y3<=n;y3++){
for(int y4=1;y4<=n;y4++){
if(x2<x1||y4<y3) continue;
ans=max(ans,sum[x2][y4]+sum[x1-1][y3-1]-sum[x1-1][y4]-sum[x2][y3-1]);
}
}
}
}
printf("%d\n",ans);
}