ZJOI2007 棋盤製作 懸線法

2022-09-12 10:24:19 字數 1028 閱讀 4104

在乙個$n \times m$的$0 1$矩陣中,求面積最大的相鄰位置數字不同的矩形和正方形。

乍一看,也許暴力可以解決問題,可以暴力的列舉所取圖形的長和寬,然後再暴力的列舉。

但是這樣的時間複雜度高達$o(n^2 m^2)$,肯定行不通,而且很難寫。

這時候,我們引入「懸線法」。

對於每個位置,我們預處理出此節點向上方最長能夠延申的合法長度$left$。

再用另乙個陣列預處理出此節點向下方最長能夠延申的合法長度$right$。

然後再橫向處理矩陣,求出每個點的橫向長度合法最長值,用一條線鏈結。

稱為「懸線」。求出懸線向上向下能延伸到的最遠位置,則懸線上下移動的軌跡為乙個合法子矩陣,

且這個子矩陣的上邊、左邊、下邊不能延伸。如果它的右邊可以延伸,則在接下來的列舉中,延伸得到的矩陣可以被列舉到,否則它就是乙個極大合法子矩陣。

時間複雜度$o(nm)$

**如下

#include #include 

intn, m;

int qrt(int

x)int pe[2005][2005], b[2005][2005], c[2005][2005

];int

main()

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

}for (int j = m; j >= 1; j--)}}

int sq_max = 0, rec_max = 0

;

for (int j = 1; j <= m; j++)

else

rec_max = std::max(rec_max, up * (left + right - 1

)); sq_max = std::max(sq_max, qrt(std::min(left + right - 1

, up)));}}

printf(

"%d\n%d\n

", sq_max, rec_max);

return0;

}

ZJOI2007 棋盤製作 動規 懸線法

zjoi2007 棋盤製作 懸線法h i,j 為點 i,j 對應的懸線的長度 l i,j 為點 i,j 對應的懸線向左最多能夠移動到的位置。r i,j 為點 i,j 對應的懸線向右最多能夠移動到的位置。預處理 對於第i行 若 i,j 和 i,j 1 不同色則l i,j l i,j 1 r i,j 1...

ZJOI2007 棋盤製作

題目描述 西洋棋是世界上最古老的博弈遊戲之一,和中國的圍棋 象棋以及日本的將棋同享盛名。據說西洋棋起源於易經的思想,棋盤是乙個8 8大小的黑白相間的方陣,對應八八六十四卦,黑白對應陰陽。而我們的主人公小q,正是西洋棋的狂熱愛好者。作為乙個頂尖高手,他已不滿足於普通的棋盤與規則,於是他跟他的好朋友小w...

ZJOI2007 棋盤製作

十二年前的zjoi我現在還切不過我是不是可以退役了 傳送門 西洋棋是世界上最古老的博弈遊戲之一,和中國的圍棋 象棋以及日本的將棋同享盛名。據說西洋棋起源於易經的思想,棋盤是乙個8 times 88 8大小的黑白相間的方陣,對應八八六十四卦,黑白對應陰陽。而我們的主人公小q,正是西洋棋的狂熱愛好者。作...