最大子正方形 (!) 動態規劃

2021-06-01 14:10:42 字數 1678 閱讀 5057

背景描述:忙完了學校的事,v神終於可以做他的「正事」:陪女朋友散步。一天,他和女朋友走著走著,不知不覺就來到了乙個千里無菸的地方。v神正要往回走,如發現了一塊牌子,牌子上有有一行小字和一張圖,小字說道:「找到圖上最大的交錯正方形之後和我聯絡,這塊地就是你的了。」在房價瘋長的年代,v神當然不願錯過這個機會,於是開始找了起來……以v神的能力當然找不出來了,你能幫v神找出來嗎?

題目描述:

圖上有乙個矩陣,由n*m個格仔組成,這些格仔由兩種顏色構成,黑色和白色。請找到到面積最大的且內部是黑白交錯(即兩個相連的正方形顏色不能相同)的正方形。

輸入格式:

第一行兩個整數n和m,分別表示行數和列數。接下來有n行,每行m個數,0或1分別表示這個格仔是黑色或白色。

輸出格式:

僅有一行,表示滿足條件最大正方形的 邊長。

樣例輸入:

3 30 1 0

1 0 0

1 1 1

樣例輸出:

2樣例解釋:

(1,1)到(2,2)這個正方形是滿足條件的,它的邊長是2

資料範圍約定:

對於30%的資料,n <= 20

對於60%的資料,n <=300

對於100%的資料,n <= 1500

var f,a:array[0..1500,0..1500] of longint;

n,m,i,j,k,sum:longint;

function min(x,y,z:longint):longint;

begin

if x>y then x:=y;

if x>z then x:=z;

exit(x);

end;

begin

assign(input,'p4.in'); assign(output,'p4.out');

reset(input); rewrite(output);

readln(n,m);

for i:=1 to n do

begin

for j:=1 to m do

read(a[i,j]);

readln;

end;

for i:=1 to n do

for j:=1 to m do

if (i mod 2)=(j mod 2) then

a[i,j]:=abs(a[i,j]-1);

for i:=1 to n do

for j:=1 to m do

if a[i,j]=1 then

begin

f[i,j]:=min(f[i-1,j],f[i,j-1],f[i-1,j-1])+1;

if f[i,j]>sum then sum:=f[i,j];

end;

fillchar(f,sizeof(f),0);

for i:=1 to n do

for j:=1 to m do

if a[i,j]=0 then

begin

f[i,j]:=min(f[i-1,j],f[i,j-1],f[i-1,j-1])+1;

if f[i,j]>sum then sum:=f[i,j];

end;

writeln(sum);

close(input); close(output);

end.

動態規劃 面積最大正方形

給定乙個矩陣,其中的元素為0或者1,要求找出其中元素全為1的面積最大的正方形。如下圖的矩陣,其元素全為1的最大正方形面積為4。方法一 對於每乙個元素,把以其為右下角的矩陣的和求出來,然後根據這個和與左上邊的元素的和的關係來求解。但這種方法時間和空間複雜度都較高。public int maximals...

221 最大正方形 動態規劃

題目描述 在乙個由 0 和 1 組成的二維矩陣內,找到只包含 1 的最大正方形,並返回其面積。示例 輸入 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 輸出 4 方法1 動態規劃 主要思路 1 該方法的實現比較簡單,主要是能夠理解動態轉移公式 dp i j min ...

221 最大正方形(動態規劃

在乙個由 0 和 1 組成的二維矩陣內,找到只包含 1 的最大正方形,並返回其面積。上班之餘還是要保持穩定的刷題習慣。做完本題後回憶了四道dp的題 爬樓梯,打家劫舍,最短路徑和,最大正方形。發現動態規劃思考量最大的還是動態轉移方程 1.本題的關鍵點就是想通,狀態轉移方程,dp i j min dp ...