懸線法的用途:針對求給定矩陣中滿足某條件的極大矩陣,比如「面積最大的長方形、正方形」「周長最長的矩形等等」。
懸線法的基本思路:維護三個二維陣列,left,right,up陣列。
left陣列儲存從map[i][j]這個點出發,滿足條件能到達的最左邊地方。
right陣列儲存從map[i][j]這個點出發,滿足條件能到達的最右邊地方。
up陣列比較耿直,直接儲存從這點以上滿足條件的能到達的最大長度。
遞推公式:up:up[i][j] = up[i-1][j] + 1
right:min(right[i][j],right[i-1],[j])
left::max(left[i][j],left[i-1][j])
例題:西洋棋是世界上最古老的博弈遊戲之一,和中國的圍棋、象棋以及日本的將棋同享盛名。據說西洋棋起源於易經的思想,棋盤是乙個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
**:
#include#define il inline
#define ri register int
#define maxn 2001
using namespace std;
il void read(int &x)
while(s<='9'&&s>='0')
x*=f;
}int res[maxn][maxn],left[maxn][maxn],right[maxn][maxn],up[maxn][maxn];
int n,m,ans1,ans2;
int main()
for(ri i=1;i<=n;i++)
for(ri j=2;j<=m;j++)
if(res[i][j]!=res[i][j-1])
left[i][j]=left[i][j-1];//預處理左邊界
for(ri i=1;i<=n;i++)
for(ri j=m-1;j>0;j--)
if(res[i][j]!=res[i][j+1])
right[i][j]=right[i][j+1];//預處理右邊界
for(ri i=1;i<=n;i++)
for(ri j=1;j<=m;j++)
int a=right[i][j]-left[i][j]+1; //橫向長度
int b=min(a,up[i][j]);//豎向長度
//printf("a:%d b:%d\n",a,b);
ans1=max(ans1,b*b);//正方形
ans2=max(ans2,a*up[i][j]);//長方形
}printf("%d\n%d",ans1,ans2);
}
洛谷 P1169 棋盤製作(懸線法DP)
題目大意 有乙個0,1矩陣。求其中的0,1交錯的最大子正方形矩陣和長方形矩陣的面積。解題思路 求這種最大子矩陣的題目很可能是懸線法。這個矩陣某個格仔 i,j 向左可能延伸到多遠,向右可能延伸到多遠,向上可能延伸到多遠,然後在確定縱向可以向下延伸時候利用轉移公式 up i j up i 1 j 1 l...
P1169 ZJOI2007 棋盤製作(懸線法)
題目描述 西洋棋是世界上最古老的博弈遊戲之一,和中國的圍棋 象棋以及日本的將棋同享盛名。據說西洋棋起源於易經的思想,棋盤是乙個8 times 88 8大小的黑白相間的方陣,對應八八六十四卦,黑白對應陰陽。而我們的主人公小q,正是西洋棋的狂熱愛好者。作為乙個頂尖高手,他已不滿足於普通的棋盤與規則,於是...
P1169 ZJOI2007 棋盤製作 懸線法
恢復內容開始 給你乙個矩陣,選出最大的棋盤,棋盤的要求是黑白相間 01不能相鄰 求出最大的正方形和矩形棋盤的面積 資料n,m 2000 這個一看就可能是n2dp,但是寫不出。單走一波暴力 sb 懸線法 就是將限制條件看成一根線,能擴充套件的最大長度,線要直 矩形就是這樣 用l i j 表示i,j合法...