zoukankan      html  css  js  c++  java
  • poj3494(求最大全1子矩阵)

    点我

    这题和最大子矩阵和都是用了压行的思想把多行压成 一行,降维后当成1维的处理。

    区别是这个是枚举底行

    先思考这样一个问题,如何求一个数组{3 4 5 2 4}围成的最大面积。

    对任意一个位置i,我们需要找到其左右边第一个小于arr[i]的数的位置p1,p2,则位置i对应的面积是(p2 - p1 - 1)* arr[i]

    需要一个辅助栈,压入弹出规则如下:(注意只压入下标)

    1. 若当前数 arr[i] 大于或等于栈顶数arr[j],压入当前数的下标i;

    2.否则,弹出栈顶数j。此时栈顶数为k,继续判断。

    只在情况2中计算想要的面积。对弹出的栈顶数j,其右边第一个比他小的数为arr[i], 其左边第一个比他小的数为arr[k]. 则对j来说,其对应的面积为(i - k - 1)* arr[j]

    我给up[0]和up[m+1]分别设置为-1,目的是让吗每个元素出栈后,任然存在栈顶元素,作为tmp元素能拓展到的最左,和每个元素都能出栈,保证每个元素对应的柱子都能计算到。

    #include<stdio.h>
    #include<iostream>
    #include<cstring>
    #include<stack>
    using namespace std;
    #define ls rt<<1
    #define rs (rt<<1)+1
    #define ll long long
    #define fuck(x) cout<<#x<<"     "<<x<<endl;
    const int inf=0x3f3f3f3f;
    const int maxn=2e3+10;
    int d[4][2]={1,0,-1,0,0,1,0,-1};
    int n,m;
    int up[maxn],mp[maxn][maxn];
    stack<int>sta;
    int main(){
        while(scanf("%d",&n)!=EOF){
            memset(up,0,sizeof(up));
            int ans=0;
            scanf("%d",&m);
            for(int i=1;i<=n;i++)
                for(int j=1;j<=m;j++)
                    scanf("%d",&(mp[i][j]));
            up[0]=up[m+1]=-1;
            for(int i=1;i<=n;i++) {
                for (int j=1;j<=m;j++)
                    up[j]=(mp[i][j]==0)?0:(up[j]+1);
                while(!sta.empty()) sta.pop();
                for(int j=0;j<=m+1;j++){
                    while(!sta.empty()&&up[sta.top()]>up[j])
                    {
                        int tmp=sta.top();sta.pop();
                        ans=max(ans,up[tmp]*(j-sta.top()-1));
                    }
                    sta.push(j);
                }
    
            }
            cout<<ans<<endl;
        }
        return 0;
    }
  • 相关阅读:
    != 比 & 的优先级高
    VC++ 报错:Heap corruption detected
    sqlite 查询数据库中所有的表名,判断某表是否存在,将某列所有数值去重后获得数量
    Unicode与UTF-8,UTF-16
    各种格式的压缩包解压,7zip 命令行
    bat批处理文件运行时隐藏cmd窗口
    标准库中 vector list等排序
    duilib 实现列表头任意拖动
    duilib 实现 XML重用(item完全重合的CList)
    C++-POJ2503-Babelfish[hash]
  • 原文地址:https://www.cnblogs.com/eason9906/p/11754711.html
Copyright © 2011-2022 走看看