P1681 最大正方形II (動態規劃)
阿新 • • 發佈:2018-06-10
end 為什麽 原來 解釋 cout eof 整數 names sizeof
輸出格式:
對於這個,自己畫個圖就可以理解應該.
題目背景
忙完了學校的事,v神終於可以做他的“正事”:陪女朋友散步。一天,他和女朋友走著走著,不知不覺就來到了一個千裏無煙的地方。v神正要往回走,如發現了一塊牌子,牌子上有有一行小字和一張圖,小字說道:“找到圖上最大的交錯正方形之後和我聯系,這塊地就是你的了。”在房價瘋長的年代,v神當然不願錯過這個機會,於是開始找了起來……以v神的能力當然找不出來了,你能幫v神找出來嗎?
題目描述
圖上有一個矩陣,由N*M個格子組成,這些格子由兩種顏色構成,黑色和白色。請找到面積最大的且內部是黑白交錯(即兩個相連的正方形顏色不能相同)的正方形。
輸入輸出格式
輸入格式:
第一行兩個整數N和M,分別表示行數和列數。接下來有N行,每行M個數,0或1分別表示這個格子是黑色或白色。
輸出格式:
僅有一行,表示滿足條件最大正方形的 邊長
輸入輸出樣例
輸入樣例#1:
3 3
0 1 0
1 0 0
1 1 1
輸出樣例#1:
2
說明
樣例解釋:
(1,1)到(2,2)這個正方形是滿足條件的,它的邊長是2
數據範圍約定:
對於30%的數據,N <= 20
對於60%的數據,N <=300
對於100%的數據,N <= 1500
Solution
這個題和之前的一道題很相似啊...
不過就是有一點點不同.就是原來的單純是一樣的矩形即可.
但這裏是 01 矩形.
所以需要一點變化,也就是將 形如 c[i][j] 而且滿足 i+j %2==1的,我們將其取反即可轉化成和原來一樣的形狀...
代碼
#include<bits/stdc++.h>
using namespace std;
const int maxn=1508;
int n,m,ans;
int c[maxn][maxn];
int f[maxn][maxn];
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>c[i][j];
if ((i+j)&1)
c[i][j]=1-c[i][j];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(!c[i][j])
{
f[i][j]=min(f[i-1][j-1],min(f[i-1][j],f[i][j-1]))+1;
ans=max(ans,f[i][j]);
}
}
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(c[i][j])
{
f[i][j]=min(f[i-1][j-1],min(f[i-1][j],f[i][j-1]))+1;
ans=max(ans,f[i][j]);
}
}
//要做兩遍,想一想為什麽?
cout<<ans<<endl;
return 0;
}
P1681 最大正方形II (動態規劃)