Day 10+11 前缀和
代码如下(示例):
#include <bits/stdc++.h>
using namespace std;
const int Maxn = 125;
int A[Maxn][Maxn]={0};//用于存数
int Az[Maxn][Maxn]={0};//前缀和(列)
int Ans[Maxn]={0};//最优解(当前)
int Pd[Maxn]={0};//状态压缩
int main(){
int N;
int Maxx=-0x3ffffff;//最小值
cin>>N;
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++){
cin>>A[i][j];
Az[i][j]=Az[i-1][j]+A[i][j];//前缀和
}
for(int i=0;i<N;i++){//从第零行开始
for(int ii=i+1;ii<=N;ii++){
for(int k=1;k<=N;k++){
Pd[k]=Az[ii][k]-Az[i][k];//压缩
Ans[k]=max(Ans[k-1]+Pd[k],Pd[k]);
Maxx=max(Ans[k],Maxx);
}
}
}
cout<<Maxx<<endl;
return 0;
}