西洋棋是世界上最古老的博弈遊戲之一,和中國的圍棋、象棋以及日本的將棋同享盛名。據說西洋棋起源於易經的思想,棋盤是乙個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
考慮一維做法 令h[i]為第i個點向左最多擴充套件多少個 那麼答案為max(h[i])
擴充套件到二維 只需求出第i行第j列向左最多擴充套件多少個 然後向上向下掃瞄看看這一行能擴充套件到哪一列 貢獻就是擴充套件個數*擴充套件列數
但這是時間複雜度o(n^3) 這時候就可以用單調棧進行優化
因為較小的擴充套件個數控制的範圍 比 能擴充套件範圍大的 大 我們維護乙個單調遞增的單調棧 從小到大掃瞄每列的每行 如果棧頂元素的擴充套件個數大於當前第i行第j列的擴充套件個數 那麼就說明 棧頂元素向下最多擴充套件到i-1行 向上最多擴充套件到第幾行可以通過出棧操作更新:若棧頂元素擴充套件個數大於當前第i行第j列的擴充套件個數 那麼第i行第j列一定能擴充套件到棧頂元素向上擴充套件的位置 可以遞推計算
最後處理完每列之後要在向棧中塞入0來計算貢獻
**:
#include #include #include using namespace std;
const int maxn=2000+10;
int s[maxn];
int up[maxn];
int a[maxn][maxn];
int maxd[maxn][maxn];
int main()
int top;
int ans1=0,ans2=0;
for(int j=1;j<=m;j++)
s[++top]=i;
up[i]=to;
} while(top&&maxd[s[top]][j]>=0)
} for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
/*for(int i=1;i<=n;i++)
for(int i=1;i<=n;i++)*/
for(int j=1;j<=m;j++)
s[++top]=i;
up[i]=to;
} while(top&&maxd[s[top]][j]>=0)
} printf("%d\n%d\n",ans1,ans2);
return 0;
}
ZJOI2007 棋盤製作
題目描述 西洋棋是世界上最古老的博弈遊戲之一,和中國的圍棋 象棋以及日本的將棋同享盛名。據說西洋棋起源於易經的思想,棋盤是乙個8 8大小的黑白相間的方陣,對應八八六十四卦,黑白對應陰陽。而我們的主人公小q,正是西洋棋的狂熱愛好者。作為乙個頂尖高手,他已不滿足於普通的棋盤與規則,於是他跟他的好朋友小w...
ZJOI2007 棋盤製作
十二年前的zjoi我現在還切不過我是不是可以退役了 傳送門 西洋棋是世界上最古老的博弈遊戲之一,和中國的圍棋 象棋以及日本的將棋同享盛名。據說西洋棋起源於易經的思想,棋盤是乙個8 times 88 8大小的黑白相間的方陣,對應八八六十四卦,黑白對應陰陽。而我們的主人公小q,正是西洋棋的狂熱愛好者。作...
棋盤製作 ZJOI2007
題目傳送門 西洋棋是世界上最古老的博弈遊戲之一,和中國的圍棋 象棋以及日本的將棋同享盛名。據說西洋棋起源於易經的思想,棋盤是乙個8 8大小的黑白相間的方陣,對應八八六十四卦,黑白對應陰陽。而我們的主人公小q,正是西洋棋的狂熱愛好者。作為乙個頂尖高手,他已不滿足於普通的棋盤與規則,於是他跟他的好朋友小...