首页 > 其他分享 >POJ-3494 Largest Submatrix of All 1’s

POJ-3494 Largest Submatrix of All 1’s

时间:2022-10-06 23:35:11浏览次数:74  
标签:int 3494 Submatrix st POJ Largest push maxn include

Largest Submatrix of All 1’s

单调栈

感觉很经典的题目,不知道为啥就没做出来

从第 \(i\) 行来说,\(a_{ij}\) 可以抽象成一个高度为 \(x\) 的山峰,\(x\) 取决于在第 \(j\) 列,从第 \(i\) 行开始往上数,有多少个连续的 \(1\)

4 4
0 1 0 1
0 1 1 0
1 1 1 0
0 0 0 0

例如对于第三行来说,他就可以抽象成一个数组

1 3 2 0

问题就转换成,对于每一行这样的一个数组,找一个 \([l, r]\) 使得区间内元素都不小于 \(y\),并且 \((r - l + 1) * y\) 最大

这样的话就可以用单调栈来做,对于每个点,假设当前那个点的值就是 \(y\),尽可能的找到最小的 \(l\) 和 最大的 \(r\)

不断取找最大值就行了

复杂度 \(O(n^2)\)

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <map>
#include <stack>
using namespace std;
const int maxn = 2e3 + 10;
int a[maxn], r[maxn], l[maxn];

int main()
{
    int n, m;
    while(scanf("%d%d", &n, &m) != EOF && (n | m))
    {
        for(int i=1; i<=m; i++) a[i] = 0;
        int ans = 0;
        a[0] = a[m + 1] = -1;
        for(int i=0; i<n; i++)
        {
            for(int j=1; j<=m; j++)
            {
                int x;
                scanf("%d", &x);
                if(x) a[j] += 1;
                else a[j] = 0;
            }
            stack<int>st;
            st.push(0);
            for(int i=1; i<=m; i++)
            {
                while(st.size() && a[st.top()] >= a[i]) st.pop();
                l[i] = st.top();
                st.push(i);
            }
            while(st.size()) st.pop();
            st.push(m + 1);
            for(int i=m; i>=1; i--)
            {
                while(st.size() && a[st.top()] >= a[i]) st.pop();
                r[i] = st.top();
                st.push(i);
            }
            for(int i=1; i<=m; i++)
                ans = max(ans, (r[i] - l[i] - 1) * a[i]);
        }
        printf("%d\n", ans);
    }
    return 0;
}

标签:int,3494,Submatrix,st,POJ,Largest,push,maxn,include
From: https://www.cnblogs.com/dgsvygd/p/16758830.html

相关文章

  • POJ-1637 Sightseeing tour
    Sightseeingtour网络流-最大流考虑欧拉图,无向边:度数全为偶数,有向边:出度和入度相等对于有向边来说,已经不可更改;对于无向边来说,可以更改其指向因此这题最终就是想找一......
  • SPOJ6059 GCDSQF Another GCD Problem 题解
    题目大意给定两个square-freenumber\(A\)和\(B\)(即没有一个素因子的次数达到\(2\)的数)的01表示形式(即将其有无该素因子排列出来,如\(105=3\times5\times7\),则......
  • jsonschema2pojo 基于json schema 生成代码
    jsonschema2pojo是一个很不错的基于jsonschema生成代码的包以及工具(maven扩展)jsonschema2pojo特点支持基本的jsonschema操作支持java扩展,比如别名,继承扩展接口外......
  • POJ 3494 Largest Submatrix of All 1’s(单调栈)
    POJ3494LargestSubmatrixofAll1’s(单调栈)题意:​ 给出一个01矩阵,请找出其中最大的全部为1构成的子矩阵。矩阵大小为\(2000*2000\)思路:​ 我们把问题分解到每一......
  • POJ 2227 The Wedding Juicer(三维接雨水 BFS 贪心
    POJ2227TheWeddingJuicer(三维接雨水BFS贪心)题意:​ 给出一个二维地图,其各点上权值为其高度。如果向其中填水,请问在这张地图中可以积得多少水。​ 地图长宽为300,高......
  • POJ 3697 USTC campus network(BFS 删边)
    POJ3697USTCcampusnetwork(BFS删边)题意:​ 有一张图,每个点\(n\le10000\)之间都有一条边。现在删去若干条边\(m\le1000000\),请问还有多少点是联通的。思路:​ 我......
  • POJ - 2348 Euclid's Game
    Euclid'sGame博弈很经典的博弈了首先明确每个状态必然都对应着一个局面,先手必败\(or\)先手必胜如果当前局面对于先手来说是能够选择的,也就是\(b>=a*2\),对于一......
  • SPOJ GSS 系列杀青
    算是题单吧太壮观了兄弟们,可是之前\(8\)题难度评分都高一档的啊。GSS1区间最大子段和板子题,用线段树随便过。GSS2相同的数只算一次,我们离线询问,顺序插入数组中的值......
  • POJ 2348 Euclid's Game(博弈论 辗转相减)
    POJ2348Euclid'sGame(博弈论辗转相减)题目:​ 给出两个数,A,B轮流操作。每次操作可以将大的数减去小的数的整数倍,若操作后出现0,执行这次操作的人胜。思路:​ 根据样例(25......
  • POJ 1064 Cable master(浮点数二分 精度处理)
    POJ1064Cablemaster(浮点数二分精度处理)题目:​ 给出n棵木头,现在要求将木头裁成k个长度相同的小木头,请问这k个小木头的最大长度是多少。裁出来后不支持拼接。所有长度......