codevs 2491 玉蟾宫
有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地。
这片土地被分成N*M个格子,每个格子里写着'R'或者'F',R代表这块土地被赐予了rainbow,F代表这块土地被赐予了freda。
现在freda要在这里卖萌。。。它要找一块矩形土地,要求这片土地都标着'F'并且面积最大。
但是rainbow和freda的OI水平都弱爆了,找不出这块土地,而蓝兔也想看freda卖萌(她显然是不会编程的……),所以它们决定,如果你找到的土地面积为S,它们每人给你S两银子。
第一行两个整数N,M,表示矩形土地有N行M列。
接下来N行,每行M个用空格隔开的字符'F'或'R',描述了矩形土地。
输出一个整数,表示你能得到多少银子,即(3*最大'F'矩形土地面积)的值。
5 6
R F F F F F
F F F F F F
R R R F F F
F F F F F F
F F F F F F
45
对于50%的数据,1<=N,M<=200
对于100%的数据,1<=N,M<=1000
方法一:求极大子矩阵 讲解不是很好,请参考:2003年国家集训队论文,王知昆,浅谈用极大化思想解决最大子矩形问题http://wenku.baidu.com/view/6b348c0203d8ce2f006623bb.html
这个问题可以转化为在矩阵中找一个全是F的最大子矩阵。
一个全是F的最大子矩阵可以看做由一个宽为1,高位h的矩形左右平移得到。
所以我们可以得出算法:
若a[i][j]=F,设以a[i][j]为基准点,向上可以延伸到的最大高度为h,即为矩阵的高。什么叫做最大高度?当往上延伸,到达上边界或碰上R时停下,所得到的高度。
设left[i][j]表示a[i][j]向左平移,最多平移到哪一列。什么是最多平移到哪一列?当向左找,到达左边界或这一列中有R时停下。
设right[i][j]表示a[i][j]向右平移,最多平移到哪一列。原理同上
那么以点a[i][j]扩展,所能得到的最大子矩阵为(right[i][j]-left[i][j]+1)
如何确定这三个数呢?对于每一个a[i][j]都需要挨个搜吗?不。
我们可以通过循环,把第一维i压掉,只留下第二维j。那么可以实现h[],right[],left[]在n行中递推试用,O(1)复杂度确定。
具体方法如下:
首先初始化条件:所有的left[]=1,right[]=列数,表示可以无限延伸,h[]=0,高度为0
设当前循环到第i行
设l表示本行中从到达第j个点,j向左碰到的第一个R,r表示向右碰到的第一个R
初始时l=0,r=列数+1
A.h[j]=p表示以a[i][j]为基准点,从第i行往上可以延伸到的最大高度。
1、如果a[i][j]=R,h[j]置为0,第i行之上已经使用完了h[j],而第i行及以下,因为第i行为R,阻断了下面的矩阵与上面连成一个矩阵,所以要置0。
2、如果a[i][j]=F,h[j]++,即可以与上一行连成一个矩阵,高度由上一行+1.
B.left[j]表示以a[i][j]为基准点,最多向左延伸到的列,即列数最大。
1、如果a[i][j]=R,
①:a[i][j]置为1,因为left只有一维且以列为下标,所以下一次再用到left[j]是下一行,也就是a[i+1][j],那么由于第i行的阻断,第i+1行不能与前面连成一个矩阵,所以置为最初条件。
②:更新l=j。
2、如果a[i][j]=F,left[j]=max(left[j],l+1)。因为left[i]在更新之前还是第i-1行的结果,所以要从第i-1行和第i行中取大。l+1是因为l存的是R的位置,矩形延伸不能到有R的地方
C.right[j]表示以a[i][j]为基准点,最多向右延伸的列,即列数最小。
1、那么如果a[i][j]=R,
①:a[i][j]置为m,因为right只有一维且以列为下标,所以下一次再用到right[j]是下一行,也就是a[i+1][j],那么由于第i行的阻断,第i+1行不能与前面连成一个矩阵,所以置为最初条件。
②:更新r=j。
2、如果a[i][j]=F,right[j]=min(right[j],r-1)。因为right[i]在更新之前还是第i-1行的结果,所以要从第i-1行和第i行中取小。r-1是因为r存的是R的位置,矩形延伸不能到有R的地方
D.更新ans
#include<cstdio>
#include<iostream>
using namespace std;
int n,m,ans;
char x;
int a[][],h[],leftt[],rightt[];
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
cin>>x;
if(x=='R') a[i][j]=;//1代表有障碍,不能延伸了
}
for(int j=;j<=m;j++)//初始化
{
leftt[j]=;
rightt[j]=m;
}
for(int i=;i<=n;i++)//枚举每一行
{
int l=,r=m+;//l向左第一个碰到的障碍,r向右第一个碰到的障碍
for(int j=;j<=m;j++)//从左往右枚举每一列,确定l
{
if(a[i][j])//当前点是障碍
{
l=j;//更新向左碰到的第一个障碍
h[j]=;//自本行以下子矩阵高度重新计数
leftt[j]=;//因为left只有一维且以列为下标,所以下一次再用到left[j]是下一行,也就是a[i+1][j],那么由于第i行的阻断,第i+1行不能与前面连成一个矩阵,所以置为最初条件
}
else//当前点不是障碍,可以参与组成矩阵
{
h[j]++;//当前列高度+1
leftt[j]=max(leftt[j],l+);//left[i]在更新之前还是第i-1行的结果,所以要从第i-1行和第i行中取大。l+1是因为l存的是R的位置,矩形延伸不能到有障碍的地方
}
}
for(int j=m;j>=;j--)//同上更新r,确定向右找到的第一个R
{
if(a[i][j])
{
r=j;
rightt[j]=m;
}
else
rightt[j]=min(rightt[j],r-);
ans=max(ans,(rightt[j]-leftt[j]+)*h[j]);
}
}
printf("%d",ans*);
}
codevs 2491 玉蟾宫的更多相关文章
- 【BZOJ-3039&1057】玉蟾宫&棋盘制作 悬线法
3039: 玉蟾宫 Time Limit: 2 Sec Memory Limit: 128 MBSubmit: 753 Solved: 444[Submit][Status][Discuss] D ...
- TYVJ1939 玉蟾宫
背景 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 描述 这片土地被分成N*M个格子,每个格子里写着'R'或者'F',R代 ...
- 【BZOJ】3039: 玉蟾宫(DP/单调栈)
http://www.lydsy.com/JudgeOnline/problem.php?id=3039 每次看到我的提交都有点淡淡的忧伤T_T.. 看到此题我想到用前缀和维护点ij向左和向上能拓展的 ...
- BZOJ_3039_玉蟾宫_(动态规划+悬线法)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=3039 n*m的矩阵由R和F组成,求全是F的子矩阵的大小的三倍. 分析 悬线法: 浅谈用极大化思 ...
- BZOJ3039: 玉蟾宫&wikioi2491 玉蟾宫
3039: 玉蟾宫 Time Limit: 2 Sec Memory Limit: 128 MBSubmit: 430 Solved: 265[Submit][Status] Descriptio ...
- bzoj3039 玉蟾宫
Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地.这片土地被分成N*M个格子,每个格子里写着'R'或者' ...
- BZOJ 3039: 玉蟾宫
3039: 玉蟾宫 Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 这片土地被分成N*M个格子,每个 ...
- BZOJ 3039: 玉蟾宫( 悬线法 )
最大子矩阵...悬线法..时间复杂度O(nm) 悬线法就是记录一个H向上延伸的最大长度(悬线), L, R向左向右延伸的最大长度, 然后通过递推来得到. ----------------------- ...
- P4147 玉蟾宫--单调栈
P4147 玉蟾宫 题目背景 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 题目描述 这片土地被分成N*M个格子,每个格子 ...
随机推荐
- PHPMailer不能发送邮件
PHPMailer不能连接SMTP服务器,和修改SMTP大小写没有关系 (2011-10-22 12:17:35) 转载▼ 标签: php phpmailer 杂谈 分类: 默认分类 PHPmaile ...
- 给现有MVC 项目添加 WebAPI
1. 增加一个WebApi Controller, VS 会自动添加相关的引用,主要有System.Web.Http,System.Web.Http.WebHost,System.Net.Http 2 ...
- 数据泵如何生成导出文件的DDL脚本
在使用exp/imp时,生成对应dumpfile文件的DDL脚本非常容易,在使用命令imp时,添加参数show, show=y表示展示imp导入的时候,输出相关DDL语句(不包括insert语句),而 ...
- Oracle SQL Developer如何配置TNS
安装了ORACLE的SQL Developer 4.0.3.16,但是连接数据库时,如果选择连接类型为"TNS",无法获取网络别名,那么要如何设置,才能访问到TNS文件呢? 此时需 ...
- sysbench测试工具
sysbench简介 Sysbench是一个模块化的.跨平台.多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况.它主要包括以下几种方式的测试:cpu性能,磁盘io性能,线程调度性 ...
- ASP.NET MVC 拓展ActionResult实现Html To Pdf 导出
之前实现了html直接转换为word文档的功能,那么是否也同样可以直接转换为pdf文档呢,网上搜了下html to pdf 的开源插件有很多 如:wkhtmltopdf,pdfsharp,itexts ...
- storm实战:基于storm,kafka,mysql的实时统计系统
公司对客户开放多个系统,运营人员想要了解客户使用各个系统的情况,在此之前,数据平台团队已经建设好了统一的Kafka消息通道. 为了保证架构能够满足业务可能的扩张后的性能要求,选用storm来处理各个应 ...
- ReactNative之坑爹的在线安装
编译一个github上ReactNative应用,根据说明只有3步: npm installreact-native run-androidenjoy 但几个步骤实在是一波三折充满着坎坷,一点都不en ...
- 留念 C语言第一课简单的计算器制作
留念 C语言第一课简单的计算器制作 学C语言这么久了. /* 留念 C语言第一课简单的计算器制作 */ #include<stdio.h> #include<stdlib.h ...
- linux vi编辑器操作手册
简介 Linux下的文本编辑器有很多种,vi 是最常用的,也是各版本Linux的标配.注意,vi 仅仅是一个文本编辑器,可以给字符着色,可以自动补全,但是不像 Windows 下的 word 有排版功 ...