#include <iostream>
#include <vector>
#include <cstdio>
#include <chrono>
using namespace std;
// 计算矩阵中不含1的子矩阵数量
int countSubmatrices(vector<vector<int>> &matrix)
{
int n = matrix.size(); // 获取矩阵的行数
int m = matrix[0].size(); // 获取矩阵的列数
int count = 0; // 用于存储不含1的子矩阵数量
vector<int> height(m, 0); // 用于存储每个列的高度,初始值为0
// 遍历矩阵中的每个元素
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (matrix[i][j] == 1) { // 如果当前元素为1,则将其所在列的高度重置为0
height[j] = 0;
} else { // 如果当前元素为0,则将其所在列的高度加1
height[j]++;
}
}
// 计算以当前元素为左上角的所有子矩阵的数量
for (int j = 0; j < m; j++) {
int minHeight = height[j]; // minHeight用于存储当前列中最小的0的数量
for (int k = j; k < m; k++) { // 枚举所有以当前元素为左上角的子矩阵
minHeight = min(minHeight, height[k]); // 更新最小的0的数量
if (minHeight == 0) { // 如果当前列中已经没有0了,则跳出循环
break;
}
count += minHeight; // 将以当前元素为左上角的子矩阵的数量加上当前列中最小的0的数量
}
}
}
return count; // 返回不含1的子矩阵数量
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<vector<int>> matrix(n, vector<int>(n));
/*
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> matrix[i][j];
}
}
*/
for (auto& row : matrix) {
for (int& elem : row) {
cin >> elem;
}
}
auto start = chrono::steady_clock::now();
int count = countSubmatrices(matrix);
auto end = chrono::steady_clock::now();
cout << count << endl; // 输出不含1的子矩阵数量
cout << "Time taken: " << chrono::duration_cast<chrono::milliseconds>(end - start).count() << " ms" << endl;
return 0;
}
例子数据:
5
0 0 0 1 1
1 0 0 0 1
0 0 0 0 0
0 0 1 0 0
0 1 1 1 0
结果:60