Largest Submatrix

给出一个\(n\times m\)的网格,网格里只放有字符a,b,c,d,w,x,,z,现在你可以将其中的w换成a,b,把x换成b,c,把y换成a,c,把z换成a,b,c,询问换完以后最大的子矩阵大小,使其包含一样的字符,\(1 ≤ m, n ≤ 1000\)。

注意到字符很少,我们可以钦定最大的子矩阵的字符,也就是尽量把字符变成变成所钦定,正确性显然。

于是接下来问题就变成了如何快速找到这个矩阵了,接下来简要提一下做法,如果初学者看不懂可以看一下这道题目Largest Rectangle in a Histogram,注意到这个类似与最大相同子矩阵的模型,我们只要按行枚举,再枚举列,暴力预处理每一列在以该行为起点上向上所能最长的连续所钦定的字符,预处理出这个问题转化为有m个宽度为1矩形,第i个矩形高度为\(h_i\),从左至右下端对齐x轴,求其中最大的子矩形。

对于这个问题,按照枚举的思想,先枚举第几个矩形i,以这个矩形为高向左右延伸能最大的矩形,也就是碰到第一个矩形高度小于i的位置,这是单调性问题,考虑单调队列维护,维护一个矩形高度单调递增的单调队列。

于是队列中保存两个值,一个是该矩形向左最远能延伸位置,一个是该矩形的高度,将要入队元素如果能满足单调性,则不予考虑,否则弹出队尾,而队尾元素未被弹出必然是从队尾所对应的位置到当前要入队的位置高度都要比队尾高度大,这也是单调队列的性质,这样队尾所对应矩形最远延伸位置即已经保存下来的最左边位置和入队元素对应位置的上一个,而至于新入队的矩形所对应的最左延升位置即队尾的最左延伸位置,依次维护下去就可以了。

时间复杂度不难得知\(O(nm)\)。

参考代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#define il inline
#define ri register
#define Size 1500
using namespace std;
char A[Size][Size];
bool B[Size][Size];
int n,m,T[Size],R,h[Size],l[Size],ans;
il void work();
template<class free>
il free Max(free,free);
int main(){
while(scanf("%d%d",&n,&m)!=EOF){ans=0;
for(int i(1);i<=n;++i)
scanf("%s",A[i]+1);
for(int i(1),j;i<=n;++i)
for(j=1;j<=m;++j)
if(A[i][j]=='a'||A[i][j]=='w'||A[i][j]=='y'||A[i][j]=='z')B[i][j]|=true;
work(),memset(B,0,sizeof(B));
for(int i(1),j;i<=n;++i)
for(j=1;j<=m;++j)
if(A[i][j]=='b'||A[i][j]=='w'||A[i][j]=='x'||A[i][j]=='z')B[i][j]|=true;
work(),memset(B,0,sizeof(B));
for(int i(1),j;i<=n;++i)
for(j=1;j<=m;++j)
if(A[i][j]=='c'||A[i][j]=='x'||A[i][j]=='y'||A[i][j]=='z')B[i][j]|=true;
work(),memset(B,0,sizeof(B)),printf("%d\n",ans);
}
return 0;
}
il void work(){
for(int i(1),j;i<=n;++i){
for(j=1;j<=m;++j){
h[j]=0,l[j]=j;while(B[i+h[j]][j])++h[j];
while(0<R&&h[T[R]]>h[j])
ans=Max((j-l[T[R]])*h[T[R]],ans),l[j]=l[T[R]],--R;
T[++R]=j;
}while(0<R)ans=Max((j-l[T[R]])*h[T[R]],ans),--R;
}
}
template<class free>
il free Max(free a,free b){
return a>b?a:b;
}

Largest Submatrix的更多相关文章

  1. Largest Submatrix(动态规划)

    Largest Submatrix Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  2. POJ-3494 Largest Submatrix of All 1’s (单调栈)

    Largest Submatrix of All 1’s Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 8551   Ac ...

  3. hdu 2870 Largest Submatrix(平面直方图的最大面积 变形)

    Problem Description Now here is a matrix with letter 'a','b','c','w','x','y','z' and you can change ...

  4. Largest Submatrix of All 1’s

    Given a m-by-n (0,1)-matrix, of all its submatrices of all 1’s which is the largest? By largest we m ...

  5. codeforces 407D Largest Submatrix 3

    codeforces 407D Largest Submatrix 3 题意 找出最大子矩阵,须满足矩阵内的元素互不相等. 题解 官方做法 http://codeforces.com/blog/ent ...

  6. Largest Submatrix of All 1’s(思维+单调栈)

    Given a m-by-n (0,1)-matrix, of all its submatrices of all 1's which is the largest? By largest we m ...

  7. POJ 3494 Largest Submatrix of All 1’s 单调队列||单调栈

    POJ 3494 Largest Submatrix of All 1’s Description Given a m-by-n (0,1)-matrix, of all its submatrice ...

  8. POJ - 3494 Largest Submatrix of All 1’s 单调栈求最大子矩阵

    Largest Submatrix of All 1’s Given a m-by-n (0,1)-matrix, of all its submatrices of all 1’s which is ...

  9. HDU 2870 Largest Submatrix (单调栈)

    http://acm.hdu.edu.cn/showproblem.php? pid=2870 Largest Submatrix Time Limit: 2000/1000 MS (Java/Oth ...

  10. MINSUB - Largest Submatrix

    MINSUB - Largest Submatrix no tags  You are given an matrix M (consisting of nonnegative integers) a ...

随机推荐

  1. 调用API接口,查询手机号码归属地(3)

    从mysql数据库获取电话号码,查询归属地并插入到数据库 #!/usr/bin/python # -*- coding: utf-8 -*- import json, urllib, sys, pym ...

  2. mysql(自动添加系统时间)timestamp类型字段的CURRENT_TIMESTAMP与ON UPDATE CURRENT_TIMESTAMP属性

    timestamp有两个属性,分别是CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP两种,使用情况分别如下: 1.CURRENT_TIMESTAMP 当要向 ...

  3. 推荐20个让你学习并精通CSS的网站

    1. A List Apart CSS Topics A List Apart,学习网页设计和最佳实践的首选网站.这个网站从1999年就开始发表关于CSS的文章,其中大部分文章都是面向那些更注重符合标 ...

  4. Go学习笔记:初识Go语言

    Go语言简介 Go语言是Google(谷歌)公司开发的一款静态型.编译型并自带垃圾回收机制和并发的编程语言. Go语言的风格类似于C语言.其语法在C语言的基础上进行了大幅的简化,去掉了不需要的表达式括 ...

  5. SOCK_SEQPACKE

    The SOCK_SEQPACKET socket type is similar to the SOCK_STREAM type, and is also connection-oriented. ...

  6. PHP算法之最接近的三数之和

    给定一个包括 n 个整数的数组 nums 和 一个目标值 target.找出 nums 中的三个整数,使得它们的和与 target 最接近.返回这三个数的和.假定每组输入只存在唯一答案. 例如,给定数 ...

  7. react 路由使用react-router-dom

    react 和vue一样都是使用封装history 来进行页面跳转,下面就来说一下react常用的路由插件react-router-dom这个东西在GitHub上 目前是最受欢迎的 首相还是先下载 n ...

  8. C# Selenium

    ChromeOptions option = new ChromeOptions(); option.AddArgument("disable-extensions"); opti ...

  9. dvaJs使用注意事项

    项目参考地址 dva-yicha 1. 使用路由跳转的方式 (1)所有的路由跳转功能都放到 dva/router 里面的 import { routerRedux } from 'dva/router ...

  10. hdu多校第七场 1006(hdu6651) Final Exam 博弈

    题意: 有n道题,这n道题共m分,要求你至少做出k道才能及格,你可以自由安排复习时间,但是只有某道题复习时间严格大于题目分配的分值时这道题才能够被做出来,求最少的,能够保证及格的复习时间.复习时间和分 ...