51nod 1158 全是1的最大子矩阵(单调栈 ,o(n*m))
生活随笔
收集整理的這篇文章主要介紹了
51nod 1158 全是1的最大子矩阵(单调栈 ,o(n*m))
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前置問題:51nod 1102 面積最大的矩形
附上鏈接:
51nod 1102 面積最大的矩形
這題的題解博客
需要了解的知識:單調棧,在前置問題中已經講解。
解題思路
代碼:
#include <bits/stdc++.h> using namespace std; typedef long long ll; int a[510][510]; int l[510],r[510]; int main(){ios::sync_with_stdio(false);int m,n;cin >> m >> n;for(int i = 1;i <= m; ++i){for(int j = 1;j <= n; ++j){cin >> a[i][j];if(a[i][j] == 1) a[i][j] += a[i][j-1];}}int ans = 0;for(int i = 1;i <= n; ++i){memset(l,0,sizeof(l));memset(r,0,sizeof(r));stack<int> s; s.push(1);a[0][i] = a[m+1][i] = -1;for(int j = 2;j <= m+1; ++j){while(s.size() and a[j][i] < a[s.top()][i]){r[s.top()] = j;s.pop();}s.push(j);}while(s.size()) s.pop();s.push(m);for(int j = m-1;j >= 0; --j){while(s.size() and a[j][i] < a[s.top()][i]){l[s.top()] = j;s.pop();}s.push(j);}for(int j = 1;j <= m; ++j){ans = max(ans, (r[j]-l[j]-1)*a[j][i]);}}cout << ans << endl;return 0; }總結
以上是生活随笔為你收集整理的51nod 1158 全是1的最大子矩阵(单调栈 ,o(n*m))的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 51nod 1102 面积最大的矩形
- 下一篇: Codeforces 988F. Rai