【題目描述】
西洋棋是世界上最古老的博弈遊戲之一,和中國的圍棋、象棋以及日本的將棋同享盛名。據說西洋棋起源於易經的思想,棋盤是乙個8*8大小的黑白相間的方陣,對應八八六十四卦,黑白對應陰陽。而我們的主人公小q,正是西洋棋的狂熱愛好者。作為乙個頂尖高手,他已不滿足於普通的棋盤與規則,於是他跟他的好朋友小w決定將棋盤擴大以適應他們的新規則。小q找到了一張由n*m個正方形的格仔組成的矩形紙片,每個格仔被塗有黑白兩種顏色之一。小q想在這種紙中裁減一部分作為新棋盤,當然,他希望這個棋盤盡可能的大。不過小q還沒有決定是找乙個正方形的棋盤還是乙個矩形的棋盤(當然,不管哪種,棋盤必須都黑白相間,即相鄰的格仔不同色),所以他希望可以找到最大的正方形棋盤面積和最大的矩形棋盤面積,從而決定哪個更好一些。於是小q找到了即將參加全國資訊學競賽的你,你能幫助他麼?
【輸入檔案】
第一行包含兩個整數n和m,分別表示矩形紙片的長和寬。接下來的n行包含乙個n * m的01矩陣,表示這張矩形紙片的顏色(0表示白色,1表示黑色)。
【輸出檔案】
包含兩行,每行包含乙個整數。第一行為可以找到的最大正方形棋盤的面積,第二行為可以找到的最大矩形棋盤的面積(注意正方形和矩形是可以相交或者包含的)。
【輸入樣例】
3 31 0 1
0 1 0
1 0 0
【輸出樣例】46
【資料規模】
對於20%的資料,n, m ≤ 80
對於40%的資料,n, m ≤ 400
對於100%的資料,n, m ≤ 2000
【題目分析】
首先把矩陣轉化一下,把橫縱座標和為偶數點的值取反,這樣就轉化成求最大的'0'或'1'矩陣。
我們只討論對於0的求法,對1類似。
首先是最大正方形問題,這是乙個經典的dp問題,f[i,j]表示以i,j為右下角的最大正方形的邊長,那麼a[i,j]=0時,f[i,j]=min(f[i-1,j-1],f[i-1,j],f[i,j-1])+1,a[i,j]=1時,f[i,j]=0,f陣列中的最大值即為第一問的答案。
對於第二問,我們用乙個單調棧來解決。
首先列舉最大矩形的下邊界,對於每乙個下邊界維護兩個(也可以說是兩次)單調棧,一次正向,一次反向,用s[i,j]表示從a[i,j]開始向上最多能擴充套件出幾個0,如果a[i,j]=1,那麼s[i,j]=0,這樣維護棧中元素的s值遞增,每次元素出棧時就可以確定這個元素可以向左或向右擴充套件多少長度了,即找到了第乙個s值小於該元素的位置,然後用每個元素的s值乘以向左向右擴充套件的長度和去更新第二問的答案就可以了。
由於每個元素最多進棧或出棧一次,每次的複雜度為o(n),這樣總的時間複雜度就是o(n^2);
【**實現】
code
1program
lyd1057;
2var a:array[0..2000,0..2000]of
0..1
;3 f:array[0..2000,0..2000]of
longint;
4 s:array[0..2000,0..2000]of
longint;
5 z:array[0..2000]of
longint;
6 l,r,p:array[0..2000]of
longint;
7ans1,ans2,i,j,m,n,k,t:longint;
8function
max(a,b:longint):longint;
9begin
10if a>b then
exit(a)
11else
exit(b);
12end;13
function
min(a,b:longint):longint;
14begin
15if athen
exit(a)
16else
exit(b);
17end;18
procedure
dp(o:longint);
19var
i,j:longint;
20begin
21for i:=1
to n do
22if a[1,i]=o then s[1,i]:=1;23
for i:=2
to m do
24for j:=1
to n do
25if a[i,j]=o then s[i,j]:=s[i-1,j]+1
26else s[i,j]:=0;27
for i:=1
to m do
28for j:=1
to n do
29begin
30if a[i,j]=o then f[i,j]:=min(f[i-1,j-1],min(f[i-1,j],f[i,j-1]))+1
31else f[i,j]:=0
;32 ans1:=max(ans1,f[i,j]);
33end;34
for i:=1
to m do
35begin
36 fillchar(l,sizeof(l),0
);37 fillchar(r,sizeof(r),0
);38 t:=0;39
for j:=1
to n do
40begin
41while (t>0)and(s[i,j]do
42begin
43 r[z[t]]:=j-z[t];
44dec(t);
45end;46
if a[i,j]=o then
47begin
48inc(t);
49 z[t]:=j;
50end;51
end;
52for j:=t downto1do
53 r[z[j]]:=n-z[j]+1
;54 t:=0;55
for j:=n downto1do
56begin
57while (t>0)and(s[i,j]do
58begin
59 l[z[t]]:=z[t]-j;
60dec(t);
61end;62
if a[i,j]=o then
63begin
64inc(t);
65 z[t]:=j;
66end;67
end;
68for j:=t downto1do
69 l[z[j]]:=z[j];
70for j:=1
to n do
71if a[i,j]=o then
72begin
73 p[j]:=l[j]+r[j]-1
;74 ans2:=max(ans2,p[j]*s[i,j]);
75end;76
end;
77end;78
begin
79readln(m,n);
80for i:=1
to m do
81for j:=1
to n do
82begin
83read(a[i,j]);
84if (i+j)and
1=0then a[i,j]:=1-a[i,j];
85end
;86 dp(0
);87 dp(1
);88 ans1:=sqr(ans1);
89writeln(ans1);
90writeln(ans2);
91end.
ZJOI2007 棋盤製作
題目描述 西洋棋是世界上最古老的博弈遊戲之一,和中國的圍棋 象棋以及日本的將棋同享盛名。據說西洋棋起源於易經的思想,棋盤是乙個8 8大小的黑白相間的方陣,對應八八六十四卦,黑白對應陰陽。而我們的主人公小q,正是西洋棋的狂熱愛好者。作為乙個頂尖高手,他已不滿足於普通的棋盤與規則,於是他跟他的好朋友小w...
ZJOI2007 棋盤製作
十二年前的zjoi我現在還切不過我是不是可以退役了 傳送門 西洋棋是世界上最古老的博弈遊戲之一,和中國的圍棋 象棋以及日本的將棋同享盛名。據說西洋棋起源於易經的思想,棋盤是乙個8 times 88 8大小的黑白相間的方陣,對應八八六十四卦,黑白對應陰陽。而我們的主人公小q,正是西洋棋的狂熱愛好者。作...
棋盤製作 ZJOI2007
題目傳送門 西洋棋是世界上最古老的博弈遊戲之一,和中國的圍棋 象棋以及日本的將棋同享盛名。據說西洋棋起源於易經的思想,棋盤是乙個8 8大小的黑白相間的方陣,對應八八六十四卦,黑白對應陰陽。而我們的主人公小q,正是西洋棋的狂熱愛好者。作為乙個頂尖高手,他已不滿足於普通的棋盤與規則,於是他跟他的好朋友小...