题意是给一个由0、1组成的矩形,问这个矩形中由0组成的最大正方形面积是多少
输入样例:
7 10
1 0 0 0 0 0 0 0 1 0
0 0 1 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 1 0 0
输出:
16
观察可以dp,dp[i][j]是以i,j这个0作为正方形右下角的角最大可以形成一个怎样的正方形,其是由上方正方形+左上方正方形+左方正方形这3个方块所形成的正方形的最小值+1为以第i行,第j列的方块作为角所能形成的正方形。
#include<iostream>
#include <stdio.h>
#include <string.h>
#include<stdlib.h>
#include <map>
#include <set>
#include <math.h>
#include <queue>
#include <algorithm>
#include<vector>
using namespace std;
const int maxn= 1e5+7;
int dp[500][500];
bool map1[500][500];
int main(){
freopen("in.txt","r",stdin);
int i,j,k,f1,f2,f3,t1,t2,t3,t4,f4;
int n;
int r,c;
cin >> r>> c;
memset(dp,0,sizeof(dp));
memset(map1,0,sizeof(map1));
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
cin >> map1[i][j];
int max1=0;
for(i=1;i<=r;i++)
for(j=1;j<=c;j++){
if(map1[i][j]!=1){
int min1=dp[i-1][j-1];
min1=min(dp[i-1][j],min1);
min1=min(dp[i][j-1],min1);
dp[i][j]=min1+1;
max1=max(max1,dp[i][j]);
}
}
cout << max1*max1 << endl;
}