洛谷 P1169 棋盤製作(懸線法DP)

2021-09-28 11:25:40 字數 917 閱讀 6591

題目大意:

有乙個0,1矩陣。求其中的0,1交錯的最大子正方形矩陣和長方形矩陣的面積。

解題思路:

求這種最大子矩陣的題目很可能是懸線法。

這個矩陣某個格仔[i,j] 向左可能延伸到多遠,向右可能延伸到多遠,向上可能延伸到多遠,然後在確定縱向可以向下延伸時候利用轉移公式:

up[i][j] = up[i-1][j]+1

left[i][j] = max(left[i-1][j].left[i][j])

right[i][j]=min(right[i-1][j],right[i][j])

i,j分別代表行和列。left和right表示向左或者向右延伸到多遠。然後(right[i][j]-left[i][j])*height[i][j],即可以得到子矩陣的面積大小。

注意初始化:

left[i][j]=right[i][j]=j;

up[i][j]=1

在確定可以向左延伸時候

left[i][j] = left[i][j-1]

在確定可以向右延伸時候

right[i][j] = right[i][j+1]

#include using namespace std;

int main()

for(int i=0;i=0;j--)

for(int i=0;i0 && chess[i][j]!=chess[i-1][j])

//cerr

int sqlen=min(len,up[i][j]);

ans1=max(ans1,sqlen*sqlen);

ans2=max(ans2,up[i][j]*len);

} cout

}

洛谷1169 棋盤製作(懸線法)

懸線法 用於解決給定矩陣滿足條件的最大子矩陣。做法 用一條線 橫豎都行 左右移動直到不滿足約束條件或者到達邊界。定義 left i,j 表示 i,j 向左擴充套件能夠到達的最左邊的位置。right i,j 表示 i,j 向右擴充套件能夠到達的最右邊的位置。up i,j 表示 i,j 向上能夠拓展的最...

洛谷P1169 棋盤製作

懸線法 好像 是可以解決給定矩陣中滿足條件的最大子矩陣的樣子 先就提論題 設 f i j 為從 i,j 點擴充套件最多能達到的最左端的點 color 設l i j 為從 i,j 點擴充套件能達到的最右端的點 color 設up i j 為從 i,j 點能擴充套件到的上界 然後就是 color 從左往...

動態規劃懸線法(P1169)

懸線法的用途 針對求給定矩陣中滿足某條件的極大矩陣,比如 面積最大的長方形 正方形 周長最長的矩形等等 懸線法的基本思路 維護三個二維陣列,left,right,up陣列。left陣列儲存從map i j 這個點出發,滿足條件能到達的最左邊地方。right陣列儲存從map i j 這個點出發,滿足條...