题意:

      给你一个n*m的矩阵<每个格子不是'F'就是'R'>,让你找一个最大的'F'矩阵,输出他的面积*3。

思路:

      比较经典的题目了,现在想起来比较好想,以前的话想着很费劲,最早先用瓶颈法在杭电上过了一个数据范围比较小的,今天的这个目测瓶颈法过不去,瓶颈法的时间复杂度是O(n^3)的,今天的这个我们可以用另外一个也是比较经典的一个方法,时间复杂度是O(n^2),思路是我们可以枚举每个矩形向上延伸的最大距离,然后把这个最大距离(竖线)像左的最大平移距离和向右的最大平移距离求出来,高H[i][j],左最大距离L[i][j] ,右最大平移距离R[i][j],然后当前答案是 now = (L[i][j] + R[i][j]
- 1) * H[i][j].这个很容易理解,每一个最大的子举行一定是某一个点的最长向上距离*左右活动范围得来的。然后对于更新的时候是这样的:

如果当前是'R'那么H[i][j] = 0 ,否则H[i][j] = H[i-1][j] + 1

如果当前是'R'那么L[i][j] = 0 ,否则如果当前的上一个是'R'或者当前是第一行,那么L[i][j] = ls ,否则L[i][j] = min(ls ,L[i-1][j]);ls 是当前行前面的最大延续长度,更新R[i][j]的时候类似,具体细节看代码。

#include<stdio.h>

#include<string.h>

#define N 1000 + 5

int map[N][N];

int H[N][N] ,L[N][N] ,R[N][N];

int minn(int x ,int y)

{

   return x < y ? x : y;

}

int maxx(int x ,int y)

{

  return x > y ? x : y;

}

int main()

{

   int t ,n ,m ,i ,j;

   int ls ,rs;

   char str[5];

   scanf("%d" ,&t);

   while(t--)

   {

      scanf("%d %d" ,&n ,&m);

      for(i = 1 ;i <= n ;i ++)

      for(j = 1 ;j <= m ;j ++)

      {

         scanf("%s" ,str);

         map[i][j] = (str[0] == 'F');

      }

      int Ans = 0;

      memset(H ,0 ,sizeof(H));

      memset(L ,0 ,sizeof(L));

      memset(R ,0 ,sizeof(R));

      for(i = 1 ;i <= n ;i ++)

      {

          for(j = 1 ;j <= m ;j ++)

          if(map[i][j]) H[i][j] = H[i-1][j] + 1;

          else H[i][j] = 0;

          ls = 0;

          for(j = 1 ;j <= m ;j ++)

          {

             map[i][j] ? ls ++ : ls = 0;

             map[i][j] ? ((i == 1 || !map[i-1][j]) ? L[i][j] = ls : L[i][j] = minn(ls ,L[i-1][j])) : L[i][j] = 0;

          }

          rs = 0;

          for(j = m ;j >= 1 ;j --)

          {

            map[i][j] ? rs ++ : rs = 0;

            map[i][j] ? ((i == 1 || !map[i-1][j]) ? R[i][j] = rs : R[i][j] = minn(rs ,R[i-1][j])) : R[i][j] = 0;

            if(map[i][j])

            {

               int now = (L[i][j] + R[i][j] - 1) * H[i][j];

               if(Ans < now) Ans = now;

            }

          }

      }

      printf("%d\n" ,Ans * 3);

   }

   return 0;

}

          

LA3029最大子矩阵的更多相关文章

  1. ACM 中 矩阵数据的预处理 && 求子矩阵元素和问题

            我们考虑一个$N\times M$的矩阵数据,若要对矩阵中的部分数据进行读取,比如求某个$a\times b$的子矩阵的元素和,通常我们可以想到$O(ab)$的遍历那个子矩阵,对它的各 ...

  2. [BZOJ1127][POI2008] KUP子矩阵

    Description 给一个n*n的地图,每个格子有一个价格,找一个矩形区域,使其价格总和位于[k,2k] Input 输入k n(n<2000)和一个n*n的地图 Output 输出矩形的左 ...

  3. 【SCOI2005】 最大子矩阵 BZOJ 1084

    Description 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. Input 第一行为n,m,k(1≤n≤100,1≤m≤2 ...

  4. 一个N*M的矩阵,找出这个矩阵中所有元素的和不小于K的面积最小的子矩阵

    题目描述: 一个N*M的矩阵,找出这个矩阵中所有元素的和不小于K的面积最小的子矩阵(矩阵中元素个数为矩阵面积) 输入: 每个案例第一行三个正整数N,M<=100,表示矩阵大小,和一个整数K 接下 ...

  5. HDU1559 最大子矩阵 (二维树状数组)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1559 最大子矩阵 Time Limit: 30000/10000 MS (Java/Others)  ...

  6. bzoj1057: [ZJOI2007]棋盘制作--最大子矩阵

    既然要求最大01子矩阵,那么把应该为0的位置上的数取反,这样就变成求最大子矩阵 最大子矩阵可以用单调栈 #include<stdio.h> #include<string.h> ...

  7. hdu 1559 最大子矩阵

    最大子矩阵 Time Limit: 30000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  8. NOIP2014pj子矩阵[搜索|DP]

    题目描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第2.4行和第2.4.5列交叉位置的元素 ...

  9. openjudge1768 最大子矩阵[二维前缀和or递推|DP]

    总时间限制:  1000ms 内存限制:  65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如,如下4 * 4的 ...

随机推荐

  1. MySQL日志收集之Filebeat和Logstsh的一键安装配置(ELK架构)

    关于ELK是什么.做什么用,我们不在此讨论.本文重点在如何实现快速方便地安装logstash和filebeat组件,特别是在近千台DB Server的环境下(为了安全保守,公司DB Server 目前 ...

  2. C# 应用 - 多线程 2) Thread 和 ThreadPool

    IEnumerable<int> intList = Enumerable.Range(1, 15); foreach (int i in intList) { ThreadPool.Qu ...

  3. BeanShell 用法汇总

    一.什么是Bean Shell BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法; BeanShell是一种松散类型的脚本语言(这点和JS类似); BeanS ...

  4. Java BasicNameValuePair怎么传数组类型的参数?

    BasicNameValuePair 传数组的话可以这样传 map.put("ids[]", 1); map.put("ids[]", 2);

  5. 【odoo14】第十八章、自动化测试

    当我们开发大型应用的时候,通过自动化测试可以大幅提高应用的健壮性.每年,odoo都会发布新版本,自动化测试对于应用的回归测试非常有帮助.幸运的是,odoo框架有不同自动化测试用例.odoo主要包括三种 ...

  6. MySQL二进制安装脚本

    MySQL二进制包自行百度,晚上很多查找办法 #!/bin/bash #二进制安装mysql并初始化密码为123456 mysql_name=mysql-5.7.31-linux-glibc2.12- ...

  7. java集合框架部分相关接口与类的介绍

    集合基础 接口 Iterable //Implementing this interface allows an object to be the target of the "for-ea ...

  8. ASP.NET Core中间件初始化探究

    前言 在日常使用ASP.NET Core开发的过程中我们多多少少会设计到使用中间件的场景,ASP.NET Core默认也为我们内置了许多的中间件,甚至有时候我们需要自定义中间件来帮我们处理一些请求管道 ...

  9. Unknown host 'd29vzk4ow07wi7.cloudfront.net'. You may need to adjust the proxy settings in Gradle.

    修改项目下build.gradle文件 在jcenter()前添加mavenCentral() 1 // Top-level build file where you can add configur ...

  10. [go-linq]-Go的.NET LINQ式查询方法

    关于我 我的博客|文章首发 开发者的福音,go也支持linq了 坑爹的集合 go在进行集合操作时,有很不舒服的地方,起初我真的是无力吐槽,又苦于找不到一个好的第三方库,只能每次写着重复代码.举个栗子 ...