忙完了學校的事,v神終於可以做他的「正事」:陪女朋友散步。一天,他和女朋友走著走著,不知不覺就來到 了乙個千里無菸的地方。v神正要往回走,如發現了一塊牌子,牌子上有有一行小字和一張圖,小字說道:「找到圖上最大的交錯正方形之後和我聯絡,這塊地就是 你的了。」在房價瘋長的年代,v神當然不願錯過這個機會,於是開始找了起來……以v神的能力當然找不出來了,你能幫v神找出來嗎?
圖上有乙個矩陣,由n*m個格仔組成,這些格仔由兩種顏色構成,黑色和白色。請找到面積最大的且內部是黑白交錯(即兩個相連的正方形顏色不能相同)的正方形。
輸入格式:
第一行兩個整數n和m,分別表示行數和列數。接下來有n行,每行m個數,0或1分別表示這個格仔是黑色或白色。
輸出格式:
僅有一行,表示滿足條件最大正方形的 邊長
輸入樣例#1:
3 3輸出樣例#1:0 1 0
1 0 0
1 1 1
2樣例解釋:
(1,1)到(2,2)這個正方形是滿足條件的,它的邊長是2
資料範圍約定:
對於30%的資料,n <= 20
對於60%的資料,n <=300
對於100%的資料,n <= 1500
【狀態】
dp[i][j]表示以(i,j)為右下角的正方形的最大邊長
【轉移】
若(i,j)與周圍四個格仔交錯,則dp[i][j] = min + 1;
否則dp[i][j] = 1
【初始狀態】
dp[1][j] = dp[i][1] = 1
【答案】
ans = max
code
1 #include 2view code3 inline void read(int &x)
410 inline int min(int a, int b)
11 inline int max(int a, int b)
1213
const
int inf = 0x3f3f3f3f;14
const
int maxn = 1500 + 10;15
const
int maxm = 1500 + 10;16
17int
n,m,num[maxn][maxm],dp[maxn][maxm],ans;
1819
intmain()
2030
}31 ans = 1;32
for(int i = 2;i <= n;++i)
33for(int j = 2;j <= n;++j)
34if((num[i - 1][j - 1] == num[i][j] && num[i - 1][j] == num[i][j - 1]) && num[i - 1][j] != num[i - 1][j - 1
])35 dp[i][j] = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1])) + 1,ans =max(ans, dp[i][j]);
36else
37 dp[i][j] = 1
; 38 printf("%d"
, ans);
39return0;
40 }
洛谷 P1681 最大正方形II 線性dp
忙完了學校的事,v神終於可以做他的 正事 陪女朋友散步。一天,他和女朋友走著走著,不知不覺就來到了乙個千里無菸的地方。v神正要往回走,如發現了一塊牌子,牌子上有有一行小字和一張圖,小字說道 找到圖上最大的交錯正方形之後和我聯絡,這塊地就是你的了。在房價瘋長的年代,v神當然不願錯過這個機會,於是開始找...
P1681 最大正方形 Iand II
在乙個n m的只包含0和1的矩陣裡找出乙個不包含0的最大正方形,輸出邊長。輸入格式 輸入檔案第一行為兩個整數n,m 1 n,m 100 接下來n行,每行m個數字,用空格隔開,0或1.輸出格式 乙個整數,最大正方形的邊長 輸入樣例 1 複製4 4 0 1 1 1 1 1 1 0 0 1 1 0 1 1...
luogu P1681 最大正方形II
交了十幾遍才過,本來這只是一道水題,然而誰讓我快讀寫炸了呢 詳情見 gg記錄 6 f i j 表示i,j位置為右下角的最大正方形 如果i或j為1,很顯然,f i j 的值最大為1,否則便要從三個方向取最小值轉移 如果不滿足轉移的條件,將其賦值為1即可 includevoid read int y i...