3039: 玉蟾宫

3039: 玉蟾宫

Time Limit: 2 Sec  Memory Limit: 128 MB
Submit: 512  Solved: 311
[Submit][Status]

Description

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

Input

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

Output

输出一个整数,表示你能得到多少银子,即(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

HINT

对于50%的数据,1<=N,M<=200

对于100%的数据,1<=N,M<=1000

Source

Poetize4

题解:这个,是我这辈子第一次成功的写最大子矩阵问题呵呵呵(phile:这这这。。。 HansBug:我是蒟蒻求不鄙视TT)。仔细说下子——首先通过二重循环递推出各个F点的左边,右边,下边各有多少个F(均算自己在内),然后开工——枚举每一个点,当为1的时候凉拌,为0的时候开始向下“挂线”(这正是网上所说的悬线法)——假如这个点正下方为0,则当啥都没做(本程序里面还是执行了下内循环,虽然次数为0。。= =);假如刚好是个1,那就顺藤摸瓜一直往下,每往下一格便记录下这根线当前左侧最窄值为多少,右侧最窄值为多少,然后当已经挂到长度为K时,则当前最新面积为K*(左侧最窄值+右侧最窄值-1)(PS:记得减1),然后每次max一下,结果就出来啦(特特特特特特特别提醒:记得乘3!!!!)

 1 var
 2         i,j,k,l,m,n,ans,a1,a2:longint;
 3         a,lef,rig,dow:array[0..1100,0..1100] of longint;
 4         c1:char;
 5 function min(x,y:longint):longint;inline;
 6         begin
 7                 if x<y then min:=x else min:=y;
 8         end;
 9 function max(x,y:longint):longint;inline;
10         begin
11                 if x>y then max:=x else max:=y;
12         end;
13 begin
14         readln(n,m);
15         for i:=1 to n do
16                 begin
17                         a[i,0]:=0;
18                         while not(eoln) do
19                                 begin
20                                         read(c1);c1:=upcase(c1);
21                                         if (c1<>‘F‘) and (c1<>‘R‘) then continue;
22                                         inc(a[i,0]);
23                                         if c1=‘F‘ then a[i,a[i,0]]:=1 else a[i,a[i,0]]:=0;
24                                 end;
25                         readln;
26                         a[i,0]:=0;
27                 end;
28         for i:=1 to n do
29                 for j:=1 to m do
30                         if a[i,j]=1 then lef[i,j]:=lef[i,j-1]+1 else lef[i,j]:=0;
31         for i:=n downto 1 do
32                 for j:=m downto 1 do
33                         begin
34                                 if a[i,j]=1 then rig[i,j]:=rig[i,j+1]+1 else rig[i,j]:=0;
35                                 if a[i,j]=1 then dow[i,j]:=dow[i+1,j]+1 else dow[i,j]:=0;
36                         end;
37         ans:=0;
38         for i:=0 to n do
39                 for j:=1 to m do
40                         if a[i,j]=0 then
41                                 begin
42                                         a1:=-1;
43                                         a2:=-1;
44                                         for k:=1 to dow[i+1,j] do
45                                                 begin
46                                                         if a1=-1 then a1:=lef[i+k,j] else a1:=min(a1,lef[i+k,j]);
47                                                         if a2=-1 then a2:=rig[i+k,j] else a2:=min(a2,rig[i+k,j]);
48                                                         ans:=max(ans,(a1+a2-1)*k);
49                                                 end;
50                                         if a1=-1 then continue;
51             end;
52     writeln(ans*3);
53 end.
时间: 2024-12-19 20:23:45

3039: 玉蟾宫的相关文章

bzoj 3039: 玉蟾宫 单调栈或者悬线法求最大子矩阵和

3039: 玉蟾宫 Time Limit: 2 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地.这片土地被分成N*M个格子,每个格子里写着'R'或者'F',R代表这块土地被赐予了rainbow,F代表这块土地被赐予了freda.现在freda要在这里卖萌...它要找一块矩形土地,要求这片土地都标着'

BZOJ 3039: 玉蟾宫【dp】

Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地.这片土地被分成N*M个格子,每个格子里写着'R'或者'F',R代表这块土地被赐予了rainbow,F代表这块土地被赐予了freda.现在freda要在这里卖萌...它要找一块矩形土地,要求这片土地都标着'F'并且面积最大.但是rainbow和freda的OI水平都弱爆了,找不出这块土地,而蓝兔也想看freda卖萌(她显然是不会编程的……),所以它们决定

BZOJ 3039 玉蟾宫 悬线法

题目大意:给出一张地图,求出这张地图中最大的子矩阵,使得这个子矩阵不包含字母'R'. 思路:简单的悬线法求最大子矩阵,还是不带权值的,很好求.好久没写悬线了,复习一下. CODE: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 1010 using namespace std; int m,n; bool map[MAX][M

BZOJ 3039 玉蟾宫 最大子矩阵 算♂法②

题意:链接 方法:最大子矩阵之算♂法② 解析: 首先这道题单调栈DP是肯定能过的,但是一点都不高端! 什么年代了还用这种方式! 所以如何彰显自己是个高端的人呢? 悬线法能满足你的需求! 什么是悬线法? 首先对于悬线的定义,对于一个n*m的坐标图中的任意一点,其向上能延伸的一个线段(不碰到坏点)称为悬线. 如果定义h[i,j]代表(i,j)该点的悬线长度. 那么,如果其上方的点是坏点,则悬线长度为0,该点为坏点,悬线长度为0,否则的话,为上方的点的悬线长度加1. 如果这么统计的话,那么最终的悬线长

BZOJ 3039 玉蟾宫

题意:求符合要求的最大子矩阵 首先,这道题单调栈可做,但我没有太明白,回头再补充. 另外,AC方法似乎不只有单调栈. 我们可以预处理出l[i][j]和r[i][j]表示(i,j)这个点在第i列向左和向右分别可以拓展到哪一个节点. 之后我们每次遍历到一个符合要求的点时,用它的上一排即L[i-1][j]和自己的l[i][j]更新出L[i][j] 即:L[i][j]=max(L[i-1][j],l[i][j]); 同理:R[i][j]=min(R[i-1][j],r[i][j]); 还有可以处理出来符

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

3039: 玉蟾宫 Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 753  Solved: 444[Submit][Status][Discuss] Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地.这片土地被分成N*M个格子,每个格子里写着'R'或者'F',R代表这块土地被赐予了rainbow,F代表这块土地被赐予了freda.现在freda要在这里卖

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

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=3039 n*m的矩阵由R和F组成,求全是F的子矩阵的大小的三倍. 分析 悬线法: 浅谈用极大化思想解决最大子矩形问题--王知昆 l[x][y]表示点(x,y)在它那一行最多能扩展到左边的位置. r[x][y]表示点(x,y)在它那一行最多能扩展到右边的位置. 每一行分别预处理l与r. 在做dp的时候:如果点(x,y)可以取,那么h[x][y]=h[x-1][y]+1,l[x][y]=max(l

[BZOJ3039] 玉蟾宫

3039: 玉蟾宫 Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 574  Solved: 347[Submit][Status][Discuss] Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地.这片土地被分成N*M个格子,每个格子里写着'R'或者'F',R代表这块土地被赐予了rainbow,F代表这块土地被赐予了freda.现在freda要在这里卖

[Tyvj1939] 玉蟾宫(单调栈)

传送门 题目 Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地.这片土地被分成N*M个格子,每个格子里写着’R’或者’F’,R代表这块土地被赐予了rainbow,F代表这块土地被赐予了freda.现在freda要在这里卖萌...它要找一块矩形土地,要求这片土地都标着’F’并且面积最大.但是rainbow和freda的OI水平都弱爆了,找不出这块土地,而蓝兔也想看freda卖萌(她显然是不会编程的……)