44 lines
1.1 KiB
C++
44 lines
1.1 KiB
C++
#include <bits/stdc++.h>
|
||
using namespace std;
|
||
const int N = 110;
|
||
int a[N][N]; // 原始数组
|
||
int s[N][N]; // 二维前缀和数组
|
||
|
||
int get(int x1, int y1, int x2, int y2) {
|
||
return s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1];
|
||
}
|
||
/*
|
||
4 5 5
|
||
00000
|
||
01111
|
||
00011
|
||
00011
|
||
|
||
参考答案:6
|
||
*/
|
||
int main() {
|
||
int n, m, k;
|
||
cin >> n >> m >> k;
|
||
char c;
|
||
// 输入原始数组
|
||
for (int i = 1; i <= n; i++)
|
||
for (int j = 1; j <= m; j++)
|
||
cin >> c, a[i][j] = c - '0';
|
||
// 构建二维前缀和数组
|
||
for (int i = 1; i <= n; i++)
|
||
for (int j = 1; j <= m; j++)
|
||
s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j];
|
||
|
||
// 遍历每个可能的矩形,计算此矩形的二维前缀和,要求大于等k,求得最小的长乘以宽的值,也就是最小矩形大小
|
||
int ans = 1e9;
|
||
for (int i = 1; i <= n; i++)
|
||
for (int j = 1; j <= m; j++)
|
||
for (int x = i; x <= n; x++)
|
||
for (int y = j; y <= m; y++)
|
||
if (get(i, j, x, y) >= k)
|
||
ans = min(ans, (x - i + 1) * (y - j + 1));
|
||
|
||
if(ans==1e9) ans=0;
|
||
cout << ans << endl;
|
||
return 0;
|
||
} |