動態規劃懸線法(P1169)

2021-09-27 05:57:44 字數 2102 閱讀 7336

懸線法的用途:針對求給定矩陣中滿足某條件的極大矩陣,比如「面積最大的長方形、正方形」「周長最長的矩形等等」。

懸線法的基本思路:維護三個二維陣列,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合法...