1 /* 2 Source :hihocoder1800 3 Problem :在n*m的方格中,每个格子有一个权值,求一个矩形区域面积大于等于S,总和最大 4 Solution :枚举固定的两列,然后可以求得符合条件的长度L,求一个长度大于等于L的最大和。最大和=当前总和-最小的前缀和,当前总和的位置与最小前缀和的位置满足条件。 5 Date :2018-08-15-20.19 6 */ 7 8 #include <bits/stdc++.h> 9 using namespace std; 10 11 typedef long long LL; 12 const int MAXN = 100005; 13 const LL MOD7 = 1e9+7; 14 15 int n,m,S; 16 17 int a[305][305]; 18 int sum[305][305]; 19 20 void work() 21 { 22 int ans=-10000*90000; 23 for (int i=1;i<=m;++i) 24 { 25 for (int j=i;j<=m;++j) 26 { 27 if (n*(j-i+1)<S) continue; 28 int sum0=0; 29 int sum1=0; 30 int L = S/(j-i+1) + !!(S%(j-i+1)); 31 int ms=10000*90000+5; 32 for (int k=1;k<=n;++k) 33 { 34 if (k>=L) 35 { 36 sum1 += sum[k-L][j]-sum[k-L][i-1]; 37 ms = min(ms, sum1); 38 } 39 sum0+=sum[k][j]-sum[k][i-1]; 40 if (ms!=10000*90000+5) 41 { 42 ans=max(ans, sum0-ms); 43 } 44 } 45 } 46 } 47 printf("%d\n",ans); 48 } 49 50 int main() 51 { 52 #ifndef ONLINE_JUDGE 53 freopen("test.txt","r",stdin); 54 #endif // ONLINE_JUDGE 55 scanf("%d%d%d",&n,&m,&S); 56 for (int i=1;i<=n;++i) 57 { 58 for (int j=1;j<=m;++j) 59 { 60 scanf("%d",&a[i][j]); 61 sum[i][j] = sum[i][j-1] + a[i][j]; 62 } 63 } 64 work(); 65 return 0; 66 }