最大01子矩陣問題(單調棧優化)

2021-10-24 13:11:17 字數 1291 閱讀 8604

顧名思義,給定n*m大小的01矩陣,要求找到1數量最多的全1子矩陣

85. maximal rectangle

思考二維問題前,先將問題降階,思考該問題在一維狀況下的解決方式會是乙個比較好的思路。

485. max consecutive ones

在01陣列中尋找最長連續1的長度

簡單的dp,維護陣列中每個位置作為結尾的最長連續1長度。

/*

author owen_q

*/class solution

else

now = 0;

}return re;}};

解決了一維的問題,對於二維問題,完全可以率先按行進行預處理,處理完後矩陣中儲存的即使改行到當前位置為止的最長連續1長度。

而為了尋找最大全1矩陣,完全可以遍歷每個位置,以預處理的長度作為第一行,分別向上下下找到第乙個小於該長度的行,中間的所有行即可用於形成全1矩陣。於是整理複雜度為

/*

author owen_q

*/class solution

cout << endl;

}int re = 0;

for(int i=0;i=0&&matrix[pos0][j]>=matrix[i][j])

pos0--;

int pos1 = i+1;

while(pos1=matrix[i][j])

pos1++;

re = max(re,matrix[i][j]*(pos1-pos0-1));}}

return re;}};

看到尋找下乙個長度更短的行,立刻想到單調棧優化,即可將複雜度降到至於具體優化策略,則需要整體思路的轉化。

相較於原來向上下分別尋找,這次只需要向下維護乙個單調棧,每次當元素出棧時,即可利用出棧的行長構造乙個全1矩陣。最後將棧清空即可得到最優結果。

構造時以出棧元素為橫向邊長,以目前棧頂到當前元素的距離為縱向邊長即可完成

/*

author owen_q

*/class solution

cout << endl;

}int re = 0;

for(int j=0;jst;

for(int i=n-1;i>=0;i--)

st.push(i);

}while(!st.empty())

cout << re << endl;

}return re;}};

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

應該能進 現在有乙個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 的矩陣最多包含的點的數量是多少。這個題意我搞了好久...

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

題目描述 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...

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

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