題目描述
西洋棋是世界上最古老的博弈遊戲之一,和中國的圍棋、象棋以及日本的將棋同享盛名。據說西洋棋起源於易經的思想,棋盤是乙個8 \times 88×8大小的黑白相間的方陣,對應八八六十四卦,黑白對應陰陽。
而我們的主人公小q,正是西洋棋的狂熱愛好者。作為乙個頂尖高手,他已不滿足於普通的棋盤與規則,於是他跟他的好朋友小w決定將棋盤擴大以適應他們的新規則。
小q找到了一張由n \times mn×m個正方形的格仔組成的矩形紙片,每個格仔被塗有黑白兩種顏色之一。小q想在這種紙中裁減一部分作為新棋盤,當然,他希望這個棋盤盡可能的大。
不過小q還沒有決定是找乙個正方形的棋盤還是乙個矩形的棋盤(當然,不管哪種,棋盤必須都黑白相間,即相鄰的格仔不同色),所以他希望可以找到最大的正方形棋盤面積和最大的矩形棋盤面積,從而決定哪個更好一些。
於是小q找到了即將參加全國資訊學競賽的你,你能幫助他麼?
輸入格式
包含兩個整數nn和mm,分別表示矩形紙片的長和寬。接下來的nn行包含乙個n \ \times mn ×m的0101矩陣,表示這張矩形紙片的顏色(00表示白色,11表示黑色)。
輸出格式
包含兩行,每行包含乙個整數。第一行為可以找到的最大正方形棋盤的面積,第二行為可以找到的最大矩形棋盤的面積(注意正方形和矩形是可以相交或者包含的)。
輸入輸出樣例
輸入 #1複製
3 31 0 1
0 1 0
1 0 0
輸出 #1複製46
說明/提示
對於20%20%的資料,n, m ≤ 80n,m≤80
對於40%40%的資料,n, m ≤ 400n,m≤400
對於100%100%的資料,n, m ≤ 2000n,m≤2000
思路:
懸線法解決,只不過擴充套件懸線的條件變成了相鄰兩個格仔不同。
不過你也可以把所有(x+y)%2=1的格仔翻轉一下。因為對所有合法的矩形(正方形),將(x+y)%2=1的格仔翻轉以後,實際就是顏色全部相同了。
#include
#include
#include
#include
using
namespace std;
const
int maxn =
2e3+7;
int a[maxn]
[maxn]
,l[maxn]
[maxn]
,r[maxn]
[maxn]
,up[maxn]
[maxn]
;int
main()
}int ans1 =
0,ans2 =0;
for(
int i =
1;i <= n;i++)}
for(
int j = m -
1;j >=
1;j--)}
}for
(int i =
1;i <= n;i++
)int x = up[i]
[j],y = r[i]
[j]- l[i]
[j]+1;
ans1 =
max(ans1,
min(x,y)
*min
(x,y));
ans2 =
max(ans2,x * y);}
}printf
("%d\n%d\n"
,ans1,ans2)
;return0;
}
P1169 ZJOI2007 棋盤製作
隨手一寫就衝進了最優解的第一頁?本來以為是dp,但是經過仔細分析.這不就是二進位制 單調棧麼?然後想正方形的情況.emm.好像正方形一定是最大矩形的子矩陣吧 聽說此題dp也可行?include include include include include using namespace std t...
P1169 ZJOI2007 棋盤製作 貪心
乙個矩陣中求乙個最大的子矩陣和子正方形使得它們其中都是01交錯。l ef ti,j left lefti,j 表示 i,j i,j i,j 往左擴充套件多遠,rig hti,jright righti j 表示 i,j i,j i,j 往右擴充套件多遠,upi j up up i,j 表示 i,j ...
題解 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...