问题描述 :
在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。
示例:
输入:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
输出: 4
输入说明 :
首先输入矩阵的行数m、列数n
然后输入m行,每行n个字符0或1,中间无空格分隔。
输出说明 :
输出一个整数
输入范例 :
4 5
10100
10111
11111
10010
输出范例 :
4
//dp没用到 遇到一个1 就往前找 遇到0就停止
#include<iostream>
#include<vector>
using namespace std;
int maxSquare(vector<vector<int>> matrix){
if(matrix.size()==0){
return 0;
}
int res=0;
vector<vector<int>> dp(matrix.size(),vector<int>(matrix[0].size()));
for(int i=0;i<matrix.size();i++){
if(matrix[i][0]==1){
res=1;
dp[i][0]=1;
}else{
dp[i][0]=0;
}
}
for(int i=0;i<matrix[0].size();i++){
if(matrix[0][i]==1){
res=1;
dp[0][i]=1;
}else{
dp[0][i]=0;
}
}
for(int i=1;i<matrix.size();i++){
for(int j=1;j<matrix[0].size();j++){
if(matrix[i][j]==0){
dp[i][j]=0;
}else{
int bian=min(j,i);
int m=i-1;
int n=j-1;
while(bian--){
int flag=0;
int tag=0;
for(int k=m;k<=i;k++){
if(matrix[k][n]==0){
flag=1;
break;
}
}
for(int l=n;l<=j;l++){
if(matrix[m][l]==0){
tag=1;
break;
}
}
m--;
n--;
if(tag||flag){
break;
}
}
if((min(i,j)-bian)*(min(i,j)-bian)>res){
res=(min(i,j)-bian)*(min(i,j)-bian);
}
}
}
}
return res;
}
int main(){
int m,n;
cin>>m;
cin>>n;
vector<int> tmp;
char temp;
vector<vector<int>> matrix;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
cin>>temp;
tmp.push_back(temp-'0');
}
matrix.push_back(tmp);
tmp.clear();
}
int res=maxSquare(matrix);
cout<<res;
}