[NOIP2015模拟10.22] 最大子矩阵 解题报告(单调栈)
2024-10-02 08:04:27
Description
我们将矩阵A中位于第i行第j列的元素记作A[i,j]。一个矩阵A是酷的仅当它满足下面的条件:
A[1,1]+A[r,s]<=A[1,s]+A[r,1](r,s>1)
其中r为矩阵A的行数,s为矩阵A的列数。
进一步,如果一个矩阵是非常酷的仅当它的每一个至少包含两行两列子矩阵都是酷的。
你的任务是,求出一个矩阵A中的一个非常酷的子矩阵B,使得B包含最多元素。
A[1,1]+A[r,s]<=A[1,s]+A[r,1](r,s>1)
其中r为矩阵A的行数,s为矩阵A的列数。
进一步,如果一个矩阵是非常酷的仅当它的每一个至少包含两行两列子矩阵都是酷的。
你的任务是,求出一个矩阵A中的一个非常酷的子矩阵B,使得B包含最多元素。
Input
第一行包含两个整数R,S(2<=R,S<=1000),代表矩阵的行数与列数。
接下来R行每行包括S个整数,代表矩阵中的元素,矩阵中元素的绝对值不大于1000000。
接下来R行每行包括S个整数,代表矩阵中的元素,矩阵中元素的绝对值不大于1000000。
Output
一行一个整数,代表子矩阵B的元素总数。如果没有一个非常酷的子矩阵,输出0。
Sample Input
输入1:
3 3
1 4 10
5 2 6
11 1 3
输入2:
3 3
1 3 1
2 1 2
1 1 1
输入3:
5 6
1 1 4 0 3 3
4 4 9 7 11 13
-3 -1 4 2 8 11
1 5 9 5 9 10
4 8 10 5 8 8
Sample Output
输出1:
9
输出2:
4
输出3:
15
【样例3解释】
在第三个样例中,子矩阵B的左上角为A[3,2],右下角为A[5,6]。
Data Constraint
对于60%的数据,满足R,S<=350。
对于100%的数据,满足2<=R,S<=1000,矩阵中元素的绝对值不大于1000000。
对于100%的数据,满足2<=R,S<=1000,矩阵中元素的绝对值不大于1000000。
唉,这道题我一直看的很懵,谈谈理解吧。
首先我们要知道,对于一个矩形2*s,若2*(s-1)是非常酷的,那么判断他们“连接”处的那个2*2矩形是不是酷的,如果是,那么这个2*s矩形就是非常酷的。
拓展开的话,我们需要从a数组中得到b数组,注意,b数组的大小和a数组的大小是不一样的。其实,b数组中的每一个元素对应a数组中的一个2*2矩形。b数组的i,j代表的就是啊数组中从以i,j为右下角的2*2矩形向上可以延伸多长的非常酷的矩形。这样的话我们发现其实b数组中左右相邻的元素放在一起组成的2*3矩形也是非常酷的,原因就是它们之间是有重叠部分的。那么接下来我们只需要对b数组统计最大子矩形就好了,用经典单调栈来维护。值得注意的是,我们要把b数组中没有更新的元素变成0,至于为什么读者只需要脑补第一行和第二行之间的关系就好。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std; const int maxn=+;
int k,s,ass;
int a[maxn][maxn],b[maxn][maxn],p[maxn];
int main()
{
scanf("%d%d",&k,&s);
for (int i=;i<=k;i++)
for (int j=;j<=s;j++)
{
scanf("%d",&a[i][j]);
b[i][j]=;
}
for(int i=;i<=k;i++)
for(int j=;j<=s;j++)
if(a[i-][j-]-a[i-][j]<=a[i][j-]-a[i][j]) b[i][j]=b[i-][j]+;
for (int i=;i<=k;i++)
for (int j=;j<=s;j++)
if (b[i][j]==) b[i][j]=;
p[]=;
for(int i=;i<=k;i++)
{
int tot=;
for(int j=;j<=s;j++)
{
while(tot&&b[i][j]<=b[i][p[tot]]) ass=max(ass,b[i][p[tot]]*(j-p[--tot]));
p[++tot]=j;
}
while(tot) ass=max(ass,b[i][p[tot]]*(s+-p[--tot]));
}
printf("%d\n",ass);
return ;
}
最新文章
- [moka同学笔记]PHPexcel之excel导出和导入
- Android ListView加载更多
- 可在广域网部署运行的QQ高仿版 -- GG叽叽V3.7,优化视频聊天、控制更多相关细节
- Nginx 简单的负载均衡配置示例(转载)
- Java并发之ThreadPoolExecutor 线程执行服务
- Count Primes
- mysql 密码篇
- leetcode:Odd Even Linked List
- Linux中的sed
- ajaxFileUpload 注意!
- UNIX环境高级编程——TCP/IP网络编程
- PHP面向对象笔记解析
- 【清北学堂2018-刷题冲刺】Contest 2
- Cocos2d-x中文显示乱码
- Database学习 - mysql 数据库 数据操作
- 23-Python3 File
- django 之manytomany
- sql server 2012 复制数据库向导出现TransferDatabasesUsingSMOTransfer()异常
- 009_【OS X和iOS系统学习笔记】 OS X架构
- AngulerJS学习(五)按需动态载入文件
热门文章
- HDU 4313 Contest 2
- [CSS3] CSS Background Images
- 基于redis ae实现 Linux中的文件系统监控机制(inotify)
- CF 447B(DZY Loves Strings-贪心)
- iOS开发- 生成/解析.vcf文件
- jQuery操作元素的属性与样式
- SSIS故障排除
- 模仿百度首页“元宵节汤圆”动图,并实现360&#176;不停旋转(CSS3的animation动画效果)
- 51nod 1562 玻璃切割 (STL map+一点点的思考)
- Elasticsearch的Groovy Script自定义评分检索