题解 P1681 【最大正方形II】
其实是最大正方形的变形。
正方形那题是令
令
1.当
2.当a[i][j]=1时
这里来着重讲一下为什么状态转移方程中为什么要取
你想啊,点
假如有一个a数组
1 0 1 0
0 1 0 1
1 0 1 0
0 1 0 0
则dp数组:(这里
1 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
2
1 1 1 1
1 0 0 0
0 0 0 0
0 0 0 0
在
1 0
0 1
是可以转移的,于是dp数组
1 1
1 2
dp数组 3
1 1 1 1
1 2 2 2
1 2 2 2
1 2 2 0
等等,
1 1 1 1
1 2 2 2
1 2 3 2
1 2 2 0
那么我们接着看
好,按照我们之前的惯性思维,如果取
1 1 1 1
1 2 2 2
1 2 3 2
1 2 4 0
发现它并不能构成边长为
1 1 1 1
1 2 2 2
1 2 3 3
1 2 3 0
也就是说,
#include <stdio.h>
#include <iostream>
#define inf 2e9+7
using namespace std;
int dp[1501][1501][2],a[1501][1501],n,m,s;
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
register int i,j;
cin>>n>>m;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
cin>>a[i][j];
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(a[i][j]==0)
{
dp[i][j][0]=min(min(dp[i-1][j][1],dp[i][j-1][1]),dp[i-1][j-1][0])+1;
s=max(s,dp[i][j][0]);
}
if(a[i][j]==1)
{
dp[i][j][1]=min(min(dp[i-1][j][0],dp[i][j-1][0]),dp[i-1][j-1][1])+1;
s=max(s,dp[i][j][1]);
}
}
}
cout<<s<<endl;
return 0;
}