【題目描述】
西洋棋是世界上最古老的博弈遊戲之一,和中國的圍棋、象棋以及日本的將棋同享盛名。據說西洋棋起源於易經的思想,棋盤是乙個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...