洛谷 P1169 ZJOI2007 棋盤製作

2021-08-26 08:21:55 字數 1535 閱讀 8465

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

1 0 1

0 1 0

1 0 0

輸出樣例#1:

4

6

思路:懸線法2,複雜度n*m.

**:

#include#define mem(a,b) memset(a,b,sizeof(a))

using namespace std;

typedef long long ll;

const ll mod = 1000000007;

const int maxn = 1e5+5;

int n,m;

int mp[2345][2345];

int u[2345][2345],l[2345][2345],r[2345][2345];

int ml[2345][2345],mr[2345][2345];

int main()

for(int i = 1;i<= n;i++)

int ans1 = 0,ans2 = 0;

for(int i = 1;i<= n;i++)

else

int c = min(mr[i][j]-ml[i][j]+1,u[i][j]);

ans1 = max(ans1,c*c);

ans2 = max(ans2,(mr[i][j]-ml[i][j]+1)*u[i][j]);}}

cout

}

洛谷 P1169 ZJOI2007 棋盤製作

給定乙個n m的01矩陣,尋找最大的,相鄰值不相同的子矩陣與子方陣。n,m leq 2,000 樸素的做法是列舉兩個點來確定矩陣,再暴力判斷能不能滿足條件。複雜度 o n 4 考慮優化 判斷能不能滿足條件時,存在很多重複判斷,可以預處理。但是,怎樣進行預處理呢?這就需要我們改變列舉方式,簡化預處理的...

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 ...