1. 程式人生 > >P1681 最大正方形II (動態規劃)

P1681 最大正方形II (動態規劃)

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 (動態規劃)