codevs 2491 玉蟾宫
题目描述 Description

  有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地。

  这片土地被分成N*M个格子,每个格子里写着'R'或者'F',R代表这块土地被赐予了rainbow,F代表这块土地被赐予了freda。
  现在freda要在这里卖萌。。。它要找一块矩形土地,要求这片土地都标着'F'并且面积最大。
  但是rainbow和freda的OI水平都弱爆了,找不出这块土地,而蓝兔也想看freda卖萌(她显然是不会编程的……),所以它们决定,如果你找到的土地面积为S,它们每人给你S两银子。

输入描述 Input Description

  第一行两个整数N,M,表示矩形土地有N行M列。
  接下来N行,每行M个用空格隔开的字符'F'或'R',描述了矩形土地。

输出描述 Output Description

  输出一个整数,表示你能得到多少银子,即(3*最大'F'矩形土地面积)的值。

样例输入 Sample Input

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

样例输出 Sample Output

45

数据范围及提示 Data Size & Hint

  对于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 玉蟾宫的更多相关文章

  1. 【BZOJ-3039&1057】玉蟾宫&棋盘制作 悬线法

    3039: 玉蟾宫 Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 753  Solved: 444[Submit][Status][Discuss] D ...

  2. TYVJ1939 玉蟾宫

    背景 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 描述 这片土地被分成N*M个格子,每个格子里写着'R'或者'F',R代 ...

  3. 【BZOJ】3039: 玉蟾宫(DP/单调栈)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3039 每次看到我的提交都有点淡淡的忧伤T_T.. 看到此题我想到用前缀和维护点ij向左和向上能拓展的 ...

  4. BZOJ_3039_玉蟾宫_(动态规划+悬线法)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=3039 n*m的矩阵由R和F组成,求全是F的子矩阵的大小的三倍. 分析 悬线法: 浅谈用极大化思 ...

  5. BZOJ3039: 玉蟾宫&wikioi2491 玉蟾宫

    3039: 玉蟾宫 Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 430  Solved: 265[Submit][Status] Descriptio ...

  6. bzoj3039 玉蟾宫

    Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地.这片土地被分成N*M个格子,每个格子里写着'R'或者' ...

  7. BZOJ 3039: 玉蟾宫

    3039: 玉蟾宫 Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 这片土地被分成N*M个格子,每个 ...

  8. BZOJ 3039: 玉蟾宫( 悬线法 )

    最大子矩阵...悬线法..时间复杂度O(nm) 悬线法就是记录一个H向上延伸的最大长度(悬线), L, R向左向右延伸的最大长度, 然后通过递推来得到. ----------------------- ...

  9. P4147 玉蟾宫--单调栈

    P4147 玉蟾宫 题目背景 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 题目描述 这片土地被分成N*M个格子,每个格子 ...

随机推荐

  1. zend studio 8 修字体和大小

    第一步:进入设置窗口    windows -> preferences 第二步:进入修改字体的选项卡.    General -> Appearance -> Colors and ...

  2. Mac下的快速回到桌面快捷方式

    今天突然发现一个Mac下快速回到桌面的快捷方式. command+F3 快速回到桌面. 如果想增加动画效果,快捷键是: command+shift+F3 这个功能虽然小,但是确实非常实用啊!

  3. 学习 HTML5-目录

    1.学习 HTML5-页面结构 2.HTML5标记 3.HTML5机构化语义元素 4.HTML5表单 5.HTML5媒体元素:Audio和Video 6.HTML5绘图API 7.HTML5 Canv ...

  4. MicroStation VBA 操作提示

    Sub TestShowCommand() ShowCommand "画条线" ShowPrompt "选择第一个点" ShowStatus "选择第 ...

  5. android项目中配置NDK自动编译生成so文件

    1 下载ndk开发包   2 在android 项目中配置编译器(以HelloJni项目为例)  2.1 创建builer  (a)Project->Properties->Builder ...

  6. MongoDB ServerStatus返回信息

    ServerStatus返回信息 ServerStatus返回mongodb中很多信息 http://docs.mongodb.org/manual/reference/command/serverS ...

  7. 这是经典的"百马百担"问题,有一百匹马,驮一百担货,大马驮3担,中马驮2担,两只小马驮1担,问有大,中,小马各几匹?

  8. MySQL出现Waiting for table metadata lock的原因以及解决方法

    转自:http://ctripmysqldba.iteye.com/blog/1938150 (有修改) MySQL在进行alter table等DDL操作时,有时会出现Waiting for tab ...

  9. 网页实时聊天之js和jQuery实现ajax长轮询

    众所周知,HTTP协议是无状态的,所以一次的请求都是一个单独的事件,和前后都没有联系.所以我们在解决网页实时聊天时就遇到一个问题,如何保证与服务器的长时间联系,从而源源不段地获取信息. 一直以来的方式 ...

  10. 带有天气预报的高大上web报表制作分享

    我用FineReport开发了挺多报表,但集成天气预报这样提高交互和人性化的还是第一次,所以跟大家分享下. 这个报表是综合的门店销售管理分析面板,可以查询业绩分析.店员销售分析,店铺排行分析(可以看出 ...