題目傳送門:
西洋棋是世界上最古老的博弈遊戲之一,和中國的圍棋、象棋以及日本的將棋同享盛名。據說西洋棋起源於易經的思想,棋盤是乙個8*8大小的黑白相間的方陣,對應八八六十四卦,黑白對應陰陽。
而我們的主人公小q,正是西洋棋的狂熱愛好者。作為乙個頂尖高手,他已不滿足於普通的棋盤與規則,於是他跟他的好朋友小w決定將棋盤擴大以適應他們的新規則。
小q找到了一張由n*m個正方形的格仔組成的矩形紙片,每個格仔被塗有黑白兩種顏色之一。小q想在這種紙中裁減一部分作為新棋盤,當然,他希望這個棋盤盡可能的大。
不過小q還沒有決定是找乙個正方形的棋盤還是乙個矩形的棋盤(當然,不管哪種,棋盤必須都黑白相間,即相鄰的格仔不同色),所以他希望可以找到最大的正方形棋盤面積和最大的矩形棋盤面積,從而決定哪個更好一些。
於是小q找到了即將參加全國資訊學競賽的你,你能幫助他麼?
輸入格式:
包含兩個整數n和m,分別表示矩形紙片的長和寬。接下來的n行包含乙個n * m的01矩陣,表示這張矩形紙片的顏色(0表示白色,1表示黑色)。
輸出格式:
包含兩行,每行包含乙個整數。第一行為可以找到的最大正方形棋盤的面積,第二行為可以找到的最大矩形棋盤的面積(注意正方形和矩形是可以相交或者包含的)。
輸入樣例#1:
3 31 0 1
0 1 0
1 0 0
輸出樣例#1:
46
對於20%的資料,n, m ≤ 80
對於40%的資料,n, m ≤ 400
對於100%的資料,n, m ≤ 2000
第一眼這題只會暴力qwq
正方形複雜度o(n^5),矩形o(n^6)。這是裸暴力,剪枝剪得好會快很多。
正解:先分類討論棋盤情況,一種是左上角為1時,剩下棋盤的合法情況;另一種是左上角為0時,剩下棋盤的合法情況。這麼做有什麼好處呢?
這樣的話就可以看做是乙個n*m的格仔上有若干個障礙點,問最大不覆蓋障礙點的子矩形大小。
那這不就跟玉蟾宮這道題一模一樣了嗎qwq
至於正方形,也可以模擬矩形來做,具體留給大家思考。(或者看下面的**qaq)
1 #include2 #include3 #include4 #include5 #include6#define ll long long
7#define ri register int
8using
namespace
std;
9const
int inf = 0x7ffffff;10
const
int n = 2000 + 10;11
12 inline int
read()
20int n, m, aans = 0, ans = 0 ; int
pos[n][n], hh[n][n], l[n] ;
2122 inline void solve(int
now)
30if(s.size()) l[i] = s.top() ; else l[i] = 0
; 31
s.push(i) ;32}
33while
(s.size()) 38}
3940 inline void
solve1()
45for(int i=1;i<=n;i++) solve(i) ;46}
4748 inline void
solve2()
52for(int i=1;i<=n;i++)
56for(int i=1;i<=n;i++) solve(i) ; 57}
5859
intmain()
67solve1() ;
68solve2() ;
69 printf("
%d\n%d
",aans,ans) ;
70return0;
71 }
幾個錯誤:
ZJOI2007 棋盤製作
題目描述 西洋棋是世界上最古老的博弈遊戲之一,和中國的圍棋 象棋以及日本的將棋同享盛名。據說西洋棋起源於易經的思想,棋盤是乙個8 8大小的黑白相間的方陣,對應八八六十四卦,黑白對應陰陽。而我們的主人公小q,正是西洋棋的狂熱愛好者。作為乙個頂尖高手,他已不滿足於普通的棋盤與規則,於是他跟他的好朋友小w...
ZJOI2007 棋盤製作
十二年前的zjoi我現在還切不過我是不是可以退役了 傳送門 西洋棋是世界上最古老的博弈遊戲之一,和中國的圍棋 象棋以及日本的將棋同享盛名。據說西洋棋起源於易經的思想,棋盤是乙個8 times 88 8大小的黑白相間的方陣,對應八八六十四卦,黑白對應陰陽。而我們的主人公小q,正是西洋棋的狂熱愛好者。作...
ZJOI2007 棋盤製作
傳送門 dp找給定區域內最大符合條件的矩形 正方形。這裡有一種新的方法 懸線法。懸線的定義 每個點 i,j 都對應一條懸線,當前點是懸線的下端,懸線的上端為乙個障礙點或者矩形的上邊界。所以乙個符合條件的矩形,我們只要使用懸線法計算出這條懸線移動到不合法位置時的邊界即可。注意left和right似乎在...