zoukankan      html  css  js  c++  java
  • USACO 2016 January Contest Fort Moo (bzoj4506)

    Bessie正在和她的朋友Elsie建一座堡垒。像任何好的堡垒一样,这需要从一个坚固的框架开始。Bessie想要在一
    个矩形上建造堡垒,并在矩形周围围上1x1的框架。Bessie已经选择了一个建造堡垒的地方 —— 一块长宽分别为
    为NM的土地(1<= N,M<= 200)。不幸的是,该地区有一些沼泽,不能用于支持框架。 请帮助贝西确定她可以用于
    建造堡垒的最大矩形区域,避免框架搭建在任何一块沼泽上。题目大意:有一个NM的矩形包含字符‘.’和‘X’,
    找出最大的边缘不包含‘X’的子矩形并输出它的面积。

    一开始以为有什么骚操作,然而。。。枚举加一个预处理。。。。
    #include <stdio.h>
    #include <algorithm>
    #include <cstring>
    #include <cmath>
    #include <queue>
    #include <vector>
    using namespace std;
    const int maxn=2e2+10;
    int n,m,ans;
    int b[maxn][maxn];
    char a[maxn][maxn]; 
    template <class T> void read(T&x)
    {
      x=0;char c=getchar();int f=0;
      while(c<'0'||c>'9'){f|=(c=='-');c=getchar();}
      while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^48),c=getchar();
      x=f?-x:x;
    }
    int main()
    {
      read(n);read(m);
      for(int i=1;i<=n;i++)scanf("%s",a[i]+1);
      for(int j=1;j<=m;j++)
       for(int i=1;i<=n;i++)
        if(a[i][j]=='X')b[i][j]=b[i-1][j]+1;
        else b[i][j]=b[i-1][j];
      for(int i=1;i<=n;i++)
       for(int j=i;j<=n;j++)
       {
            int x=0,y=0;
            for(int k=1;k<=m;k++)
             if(b[j][k]-b[i-1][k]==0)
             {
                 x=max(x,k);y=x;
                 while(x<m&&a[i][x+1]=='.'&&a[j][x+1]=='.')
                 {
                   x++;
                   if(b[j][x]-b[i-1][x]==0)y=x;
                 }
                 ans=max(ans,(j-i+1)*(y-k+1));
             }
       }
      printf("%d",ans);
      return 0;
    }
     
  • 相关阅读:
    Linux 共享库
    使用Visual Studio(VS)开发Qt程序代码提示功能的实现(转)
    ZOJ 3469 Food Delivery(区间DP)
    POJ 2955 Brackets (区间DP)
    HDU 3555 Bomb(数位DP)
    HDU 2089 不要62(数位DP)
    UESTC 1307 windy数(数位DP)
    HDU 4352 XHXJ's LIS(数位DP)
    POJ 3252 Round Numbers(数位DP)
    HDU 2476 String painter (区间DP)
  • 原文地址:https://www.cnblogs.com/new-hand/p/9285053.html
Copyright © 2011-2022 走看看