• 【CH1803】City Game


    “二维”单调栈的题目,一上来有点没有思路,想用dp做一下,然而转念一想,假设我们把这个图按照行进行划分,先处理前1行的最大矩形,在处理前2行的最大矩形,再处理前3行的最大矩形……最后用子问题的答案更新答案即可。这样一来,这个问题就转化成了一个简化版单调栈的题目。

    简化版点这里,所以,我们采用这种思路即可得出答案,时间复杂度为简化版的n倍(相当于做了n次单调栈),在n≤1000时可以通过。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 using namespace std;
     6 typedef long long ll;
     7 int n,m,a[1010][1010],b[1010],s[1010],p,ans,w[1010];
     8 int main() {
     9     cin>>n>>m;
    10     for(int i=1;i<=n;i++)
    11         for(int j=1;j<=m;j++) {
    12             char c;
    13             cin>>c;
    14             a[i][j]=c=='F';
    15         }
    16     for(int i=1;i<=n;i++) {
    17         for(int j=1;j<=m;j++)
    18             b[j]=a[i][j]?b[j]+1:0;
    19         p=0;
    20         for(int j=1;j<=m+1;j++) {
    21             if(b[j]>s[p]) s[++p]=b[j],w[p]=1;
    22             else {
    23                 int tot=0;
    24                 while(s[p]>b[j]) {
    25                     tot+=w[p];
    26                     ans=max(ans,tot*s[p]);
    27                     p--;
    28                 }
    29                 s[++p]=b[j];
    30                 w[p]=tot+1;
    31             }
    32         }
    33     }
    34     cout<<ans*3<<endl;
    35     return 0;
    36 }
    AC Code
  • 相关阅读:
    开源框架/软件汇总
    如何查看Maven项目的jar包依赖
    我的前端技术栈(2018版)
    解决在Mac上用pyenv安装python3失败的问题
    学习jenv
    学习sbtenv
    解决MAC下修改系统文件没权限的问题
    学习Spring Boot
    学习音标
    C# 对List中的Object进行排序
  • 原文地址:https://www.cnblogs.com/shl-blog/p/10885867.html
Copyright © 2020-2023  润新知