zoukankan      html  css  js  c++  java
  • 【最大子矩阵】 城市游戏

    传送门

    题意

    (N imes M)矩阵,每个格子为(R)(F),求面积最大的全部为(F)的子矩阵,输出(3 imes S)

    数据范围

    (1leq Nleq 1000)
    (1leq Mleq 1000)

    题解

    • 对每一行,求出每一列 (F) 的高度,面积求法同直方图中的最大矩形,时间复杂度为(O(NM))

    • 区别是当前行中当前列没有 (F) 即高度为0,断开了

    Code

    #include<bits/stdc++.h>
    using namespace std;
    #define rep(i, a, n) for(int i = a; i < n; i ++)
    const int N = 1010;
    int n, m;
    bool a[N][N];
    int stk[N], t;
    int h[N], wid[N];
    
    int solve(int i) {
        int res = 0;
        t = 0;
        rep(j, 0, m)
            if(a[i][j]) h[j]++;
            else h[j] = 0;
            
        rep(j, 0, m + 1) {
            if(h[j] > stk[t]) {
                stk[++t] = h[j];
                wid[t] = 1;
            }
            else {
                int width = 0;
                while(stk[t] > h[j]) {
                    width += wid[t];
                    res = max(res, width * stk[t]);
                    t--;
                }
                stk[++t] = h[j];
                wid[t] = width + 1;
            }
        }
        return res;
    }   
    int main() {
        char c;
        cin>>n>>m;
        rep(i, 0, n) rep(j, 0, m) {
            cin>>c;
            a[i][j] = (c == 'F') ? 1 : 0;
        }
        int ans = 0;
        rep(i, 0, n) ans = max(ans, solve(i));
        cout<<ans * 3<<endl;
    }
    
  • 相关阅读:
    js简单排序
    js希尔排序
    js直接插入排序
    大数运算
    IOC和AOP的理解 (持续更新)
    频发事件的缓存技巧
    执行上下文深入解析(Execution Context)
    二分
    HDU 3790 最短路径问题 (双重权值)
    浅谈Targan算法
  • 原文地址:https://www.cnblogs.com/hhyx/p/13284207.html
Copyright © 2011-2022 走看看