题解
- 先搞一个前缀和,sum[i][j]表示第i行前j个的和
- 那么先O(n^2)枚举一个l和一个r
- 然后再O(n)暴力从上面往下加
- 如果ans<0把ans=0
代码
1 #include <cstdio>
2 #include <iostream>
3 using namespace std;
4 int n,m,a[210][210];
5 long long sum[210][210],ans,mx;
6 int main()
7 {
8 scanf("%d%d",&n,&m);
9 for (int i=1;i<=n;i++)
10 for (int j=1;j<=m;j++)
11 {
12 scanf("%d",&a[i][j]);
13 sum[i][j]=sum[i][j-1]+a[i][j];
14 }
15 for (int i=1;i<=m;i++)
16 for (int j=i;j<=m;j++)
17 {
18 ans=0;
19 for (int k=1;k<=n;k++)
20 {
21 ans=ans+sum[k][j]-sum[k][i-1];
22 mx=max(mx,ans);
23 ans=ans<0?0:ans;
24 }
25 }
26 printf("%lld",mx);
27 return 0;
28 }