COCI NEO 單調棧求最大全1子矩陣

2021-10-08 00:02:54 字數 2070 閱讀 7148

應該能進

現在有乙個n*m的矩陣,定義乙個矩陣(r>=2,c>=2)是cool的當

a[i]

[j]+a[i-1]

[j-1

]<=a[i]

[j-1

]+a[i-1]

[j]

定義乙個矩陣是非常cool的,當所有它的子矩陣(r>=2,c>=2)是cool的。問你這個矩陣中非常cool 的矩陣最多包含的點的數量是多少。

這個題意我搞了好久…coci每一場比賽我都很難受因為我搞不懂他的題意。

然後的話,我們可以發現乙個規律:

對於這樣兩個矩陣,如果他們都是cool的,也就是說

a +e

<=b

+d&&

b+f<=c

+ea+e<=b+d\&\&b+f<=c+e

a+e<=b

+d&&

b+f<=c

+e那麼兩個式子合併:

a +e

+b+f

≤b+d

+c+e

a+e+b+f\le b+d+c+e

a+e+b+

f≤b+

d+c+

e=>a+

f≤c+

d=>a+f\le c+d

=>a+

f≤c+

d那麼就是說如果兩個相鄰的同高或者同寬的矩陣都是cool的話,那麼整個就是cool的。於是我們做出所有2*2的矩陣的情況,如果是cool的,就將右下角的值置為1,然後就找最大01子矩陣就ok啦。

注意要用快讀,但是我的快讀在這裡不能用?用了別人的快讀

#include

using

namespace std;

const

int n=

1e3+5;

using

namespace std;

namespace fast_io

else

return

(*iois++);

}void

write()

void

putchar

(char x)

inline int

read()

inline long

long

read_ll()

template <

class

int>

void

print

(int x,

char ch =

'\0'

)void

getstr

(char

* s,

int& l)

void

putstr

(const

char

* s)

}// namespace fast_io

using

namespace fast_io;

int sum[n]

[n],d[n]

[n];

struct node

;stackst;

int a[n]

[n];

intmain()

}int ans=0;

for(

int i=

1;i<=n;i++)if

(st.

empty()

) ans=

max(ans,sum[i]

[j]*j+sum[i]

[j]+j+1)

;if(id==-1

)id=j;

st.push()

;}}printf

("%d\n"

,ans?ans:-1

);}/*

3 31 111 10

5 111 116

1 111 2

*/

POJ 3494(最大全1子矩陣,單調棧)

題目 分析 相當於是最大直方和的二維版,對於最大直方和問題,我們對每個點找到最左邊大於等於它的位置和最右邊大於等於它的位置,用乙個單調棧可以在o n 空間o n 時間內完成,對於本題,我們即分別將每一行作為直方圖的x軸,所以時間上是o mn 空間上仍需o n 輔助 include define ma...

單調棧結構問題 求最大子矩陣

題目描述 given a 2d binary matrix filled with 0 s and 1 s,find the largest rectangle containing only 1 s and return its area.for example,given the followi...

最大矩形 單調棧

在這裡先簡單描述一下單調棧 單調棧 一種線性資料結構,棧內元素自棧頂到棧底滿足單調性。有單調遞增棧和單調遞減棧。如果要加入棧的元素不滿足單調性,則要將棧頂元素彈出,直到滿足條件為止,然後將該元素入棧 作用 給乙個直方圖,求直方圖中的最大矩形的面積。例如,下面這個中直方圖的高度從左到右分別是2,1,4...