题目
求一个最大的全1正方形的面积。
分析
因为边长*边长=面积,所以求面积就是等于求边长。
懂得代码里为什么用unsigned short了吧。
dp
状态转移方程:
f
[
i
]
[
j
]
f[i][j]
f[i][j]表示以
(
i
−
x
,
j
−
x
)
(i-x,j-x)
(i−x,j−x)和
(
i
,
j
)
(i,j)
(i,j)作为左上角和右下角,
(
0
<
=
x
<
=
i
,
j
)
(0<=x<=i,j)
(0<=x<=i,j)的边长(
x
x
x不确定)。
f [ i ] [ j ] = m i n ( f [ i − 1 ] [ j ] , f [ i − 1 ] [ j − 1 ] , f [ i ] [ j − 1 ] ) + 1 f[i][j]=min(f[i-1][j],f[i-1][j-1],f[i][j-1])+1 f[i][j]=min(f[i−1][j],f[i−1][j−1],f[i][j−1])+1
代码
#include <cstdio>
using namespace std;
unsigned short n,m,f[1001][1001]; int ans;
int min(int a,int b,int c){
if (a>b) a=b;
if (a>c) a=c;
return a;
}
int max(int a,int b){return (a>b)?a:b;}
int main(){
scanf("%d",&n); char x;
for (int i=1;i<=n;i++)
for (int j=0;j<=n;j++)
if (!j) getchar();//被输入坑了WAW
else if ((x=getchar())=='1')
f[i][j]=min(f[i-1][j],f[i][j-1],f[i-1][j-1])+1,
ans=max(ans,f[i][j]);
printf("%d",ans*ans);
return 0;
}