继续补题……
题目链接:
http://acm.hit.edu.cn/hoj/problem/view?id=2000
题目描述:
Maximum Submatrix
Have you ever watched the movie Matrix ? In that movie, the term Matrix does not mean a mathematical thing, but a complicated AI system.
In this problem, we will go back to the original meaning of matrix. Given a 0-1 matrix, you are required to find the maximum submatrix in it which contains only 0s.
Input
An integer T (T <= 110) in the first line indicates the number of test case. For each test case, two integers N and M will be given first, then followed by a N * M 0-1 matrix.
1 <= N, M <= 100.
Output
For each test case, print the number of elements in the maximum submatrix in a single line.
Sample Input
2 2 2 0 0 0 0 4 5 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 1 1 0 0 0
Sample Output
4 8
题目大意:
找出最大的连续子矩阵使得其中元素均为0
思路:
dp
记录每列的前缀和,这样两数相减即可得到一列中任意连续数的和
二重for循环控制行的范围i~j,然后在这个范围中对于列贪心求解,类似于连续最大序列和
复杂度O(n^3),100组数据,一秒内可做
代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 6 const int N = 110; 7 8 int main() { 9 int t, m, n, ans, num[N][N], sum[N][N] = { 0 }; 10 cin >> t; 11 while (t--) { 12 ans = 0; 13 scanf("%d%d", &m, &n); 14 for (int i = 1; i <= m; ++i) 15 for (int j = 1; j <= n; ++j) { 16 scanf("%d", &num[i][j]); 17 sum[i][j] = sum[i - 1][j] + num[i][j]; //记录一列中的前缀和 18 } 19 for (int i = 0; i < m; ++i) 20 for (int j = i + 1; j <= m; ++j) { //控制行 21 int m_sum = 0, po = 1, tmp = 0; 22 for (int k = 1; k <= n; ++k) { //贪心求解 23 m_sum += sum[j][k] - sum[i][k]; 24 if (m_sum) 25 tmp = 0, po = k + 1, m_sum = 0; 26 else 27 tmp += j - i, ans = max(ans, tmp); 28 } 29 } 30 printf("%d\n", ans); 31 } 32 }