棋盤製作 題解

2021-06-09 14:22:30 字數 1850 閱讀 1256

【題目描述】

西洋棋是世界上最古老的博弈遊戲之一,和中國的圍棋、象棋以及日本的將棋同享盛名。據說西洋棋起源於易經的思想,棋盤是乙個8*8大小的黑白相間的方陣,對應八八六十四卦,黑白對應陰陽。

而我們的主人公小q,正是西洋棋的狂熱愛好者。作為乙個頂尖高手,他已不滿足於普通的棋盤與規則,於是他跟他的好朋友小w決定將棋盤擴大以適應他們的新規則。

小q找到了一張由n*m個正方形的格仔組成的矩形紙片,每個格仔被塗有黑白兩種顏色之一。小q想在這種紙中裁減一部分作為新棋盤,當然,他希望這個棋盤盡可能的大。

不過小q還沒有決定是找乙個正方形的棋盤還是乙個矩形的棋盤(當然,不管哪種,棋盤必須都黑白相間,即相鄰的格仔不同色),所以他希望可以找到最大的正方形棋盤面積和最大的矩形棋盤面積,從而決定哪個更好一些。

於是小q找到了即將參加全國資訊學競賽的你,你能幫助他麼?

【資料範圍】

對於20%的資料,n, m ≤ 80

對於40%的資料,n, m ≤ 400 

對於100%的資料,n, m ≤ 2000

【題解】

這道題是浙江省07年的省選題,前幾天做過一道類似的題目,所以順手就刷了一下。這裡介紹國家集訓隊03年的《**用極大化思想解決最大子矩形問題》中提到的一種方法。

我們先考慮最大的矩形面積。很容易得到,最大的矩形一定是乙個極大矩形(即四邊都不能向上拓展的矩陣),也就是說,他的上邊要麼是整個矩陣的上邊,要麼被一對相同的數卡住。利用這個性質,我們可以得到乙個優秀的演算法:設行指標i,列指標j,j從左往右,i從上往下掃瞄,計算出當前點(j,i)與其上方能拓展的最遠點所夾的最大矩形面積。由於剛才提到的性質,這樣的掃瞄一定能掃過最大矩形的上下邊界,而左右邊界則可以用乙個o(n^2)的動規來解決。這樣,我們就可以在o(n^2)的時間內求出最大矩形。

而解決了求最大矩形的問題後,最大正方形的問題也就好解決了。套用最大矩形的演算法,可以輕鬆的求出最大正方形,具體實現請參看我的程式。

code

program chess;

type

int=longint;

var i,j,m,n:int;

matrix,max_l,max_r:array[0..2001,0..2001]of int;

function min(x,y:int):int;

begin

if xmatrix[i,j-1])then

max_l[i,j]:=max_l[i,j-1]+1

else max_l[i,j]:=0;

for i:=1 to n do

for j:=m-1 downto 1 do

if(matrix[i,j]<>matrix[i,j+1])then

max_r[i,j]:=max_r[i,j+1]+1

else max_r[i,j]:=0;

for i:=1 to m do matrix[0,i]:=matrix[1,i];

end;

procedure get_ans;

var min_l,min_r,s,l,ans2,ans:int;

begin

ans:=0;ans2:=0;

for j:=1 to m do begin

for i:=1 to n do begin

if matrix[i,j]=matrix[i-1,j]then begin

min_l:=maxlongint;min_r:=maxlongint;l:=0;

end;

min_l:=min(min_l,max_l[i,j]);

min_r:=min(min_r,max_r[i,j]);

s:=min_l+min_r+1;inc(l);

if ans

by qw

題解 P1169 ZJOI2007 棋盤製作

依然是懸線法,不過要注意這裡棋盤向外擴張的時候需要滿足條件 g i j g i 1 j 0g i j oplus g i 1 j 0 g i j g i 1 j 0最大正方形可以由過程中求出的每乙個極大棋盤得到。include include using namespace std const in...

單調棧 棋盤製作

program as var a,b array 0.2000,0.2000 of longint c array 0.2000,1.2 of longint n,m,i,j,l,cfx,zfx longint function min a,b longint longint begin if a ...

解題隨筆 棋盤製作

題目來自於洛谷 p1169 棋盤製作 在乙個01矩陣中找到乙個最大的01相間的正方形與長方形。這個問題可以使用動態規劃 懸線法來解決。陣列 lef t i j righ t i j up i j left i j right i j up i j left i j rig ht i j up i j...