此类题目详解:浅谈用极大化思想解决最大子矩阵问题_Coco_T_的博客-CSDN博客
例题
此题用上面详解第二种思路,可以做的优化是:先将矩阵转化为柱状图,即每格存储它以上连续非1的个数,再向右延伸,搬运大佬的代码:
#include<iostream>
using namespace std;
constexpr size_t MAXN = 26; // C++11 标准中,定义变量时可以用 constexpr 修饰,从而使该变量获得在编译阶段即可计算出结果的能力
static char mat[MAXN][MAXN];
int main() {
int n, m;
cin >> n >> m;
// 把数据存入矩阵,规定矩阵大小后不用按行、列存
for ( int i = 0; i < n; ++i) {
cin >> mat[i];
}
// 存为矩形图
for (int col = 0; col < m; ++col) {
for (int row = n - 1; row >= 0; --row ) {
if (mat[row][col] == '1') {
mat[row][col] = 0;
}
else{
mat[row][col] = mat[row + 1][col] + 1;
}
}
}
int q = 0;
for (int row = 0; row < n; ++row){
for (int left = 0; left < m; ++left){
int minHeight = 0x7fffffff; //初始设置周长为无穷大
if (mat[row][left] == 0) continue;
for (int right = left; right < m && mat[row][right]; ++right){
if (mat[row][right] < minHeight) {
minHeight = mat[row][right];
}
const int qNow = minHeight + right - left + 1;
if (qNow > q){
q = qNow;
}
}
}
}
cout << (q << 1) << endl;
return 0;
}