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 }