题目链接:https://www.luogu.org/problemnew/show/P1719
这道题挺好做的 又是一道练前缀和的题
#include <bits/stdc++.h>
#define Max(a,b) a>b?a:b
#define rep(i,j,n) for(register int i=j;i<=n;i++)
using namespace std;
typedef long long LL;
inline LL read() { LL x=0; int f=1; char ch=getchar();
while(!isdigit(ch)) { if (ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); return x*f;
}
int n,m;
const int N=1<<7;
int a[N][N];
signed main(){
n=read();
rep(i,1,n) rep(j,1,n) a[i][j]=read()+a[i-1][j]+a[i][j-1]-a[i-1][j-1];
LL ans=0;
rep(x1,1,n) rep(y1,1,n) rep(x2,x1+1,n) rep(y2,y1+1,n) ans=Max(ans,a[x2][y2]-a[x1-1][y2]-a[x2][y1-1]+a[x1-1][y1-1]);
cout << ans << endl ;
return 0;
}
前缀和的代码
同样 这需要DP来降低时间复杂度 提高效率orz
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
inline LL read () { LL res = 0 ;int f (1) ;char ch = getchar ();
while (!isdigit(ch)) { if (ch == '-') f = -1 ;ch = getchar();}
while (isdigit(ch)) res = (res << 1) + (res << 3) + (ch ^ 48) ,ch = getchar(); return res * f ;
}
int n,s[121][121],f[121],ans,p,x,ma;
signed main() {
n=read();
for(register int i=1; i<=n; i++) f[i]=-1e9;
for(register int i=1; i<=n; i++)
for(register int j=1; j<=n; j++) {
x=read();
maxn=Max(maxn,x);
s[i][j]=s[i-1][j]+x;
}
ans=-1e9;
for(register int i=1; i<=n; i++)
for(register int j=i; j<=n; j++)
for(register int k=1; k<=n; k++) {
p=s[j][k]-s[i-1][k]; f[k]=max(p,f[k-1]+p); ans=max(ans,f[k]);
}
cout << ans << endl ;
return 0;
}