題目大意:
有乙個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 這個點出發,滿足條...