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的更多相关文章
- Largest Submatrix(动态规划)
Largest Submatrix Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- POJ-3494 Largest Submatrix of All 1’s (单调栈)
Largest Submatrix of All 1’s Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 8551 Ac ...
- hdu 2870 Largest Submatrix(平面直方图的最大面积 变形)
Problem Description Now here is a matrix with letter 'a','b','c','w','x','y','z' and you can change ...
- 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 ...
- codeforces 407D Largest Submatrix 3
codeforces 407D Largest Submatrix 3 题意 找出最大子矩阵,须满足矩阵内的元素互不相等. 题解 官方做法 http://codeforces.com/blog/ent ...
- 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 ...
- 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 ...
- 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 ...
- HDU 2870 Largest Submatrix (单调栈)
http://acm.hdu.edu.cn/showproblem.php? pid=2870 Largest Submatrix Time Limit: 2000/1000 MS (Java/Oth ...
- MINSUB - Largest Submatrix
MINSUB - Largest Submatrix no tags You are given an matrix M (consisting of nonnegative integers) a ...
随机推荐
- java8如何对List<Bean>进行去重和覆盖
背景:有一批数据源从kafka给过来,接收到后需要处理,然后入库,我们用一个线程消费下来,一次消费30000条, 按照对象的概念,可以用List<Person>来表示,因为某种原因,需要根 ...
- 并发编程之Android中AsyncTask使用详解(四)
更多Android高级架构进阶视频免费学习请点击:[https://space.bilibili.com/474380680] 在Android中我们可以通过Thread+Handler实现多线程通信 ...
- 图像处理_Image
1. 安装 输入 pip install PIL报错: ERROR: Could not find a version that satisfies the requirement PI ...
- null == null 或者 [] == [] 或者{} == {} 或者alert(1|| 2) 或者alert(1&& 2) 结果及原理
相信面试的小伙伴们都会遇到此头大的问题,是不是很想骂一句面试官:你白痴啊,鬼都用不着的东西拿来问,你还别说,这些看似用不着的东西却包含着最基础的原理,那我们来理一理. 1.alert(1||2)和 a ...
- QT MSVC2017 ratio chrono
如果引用了stdint.h可能会引发一些列错误,各种未申明和语法错误. 参加以下帖子解决问题 https://github.com/ftylitak/qzxing/issues/54 When com ...
- js 正则替换的使用方法
function compress(source) { const keys = {}; ⇽--- 存储目标key source.replace( /([^=&]+)=([^&]*)/ ...
- List之取不同元素
1.工具-->NuGet包管理器-->管理解决方案的NuGet包程序包 2.添加System.Linq包 3.引用 using System.linq List<int> li ...
- VS 2015 Download
企业版:http://download.microsoft.com/download/B/8/F/B8F1470D-2396-4E7A-83F5-AC09154EB925/vs2015.ent_chs ...
- thinkphp 多语言支持
ThinkPHP内置多语言支持,如果你的应用涉及到国际化的支持,那么可以定义相关的语言包文件.任何字符串形式的输出,都可以定义语言常量. 要启用多语言功能,需要配置开启多语言行为,在应用的配置目录下面 ...
- Optimal Marks SPOJ - OPTM
传送门 一个无向图,每个点有点权,某些点点权确定了,某些点由你来确定,边权为两个点的异或和,要使边权和最小. 这不是一道按位做最小割的大水题么 非常开心地打了,还非常开心地以为有spj,然后非常开心地 ...