【洛谷】P4147 玉蟾宫 解题报告
【洛谷】P4147 玉蟾宫 解题报告
题目背景
有一天,小猫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’矩形土地面积)的值。
输入输出样例
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
output
45
思路:
这道题可以用一种叫 悬线法 的方法!
所谓悬线法,就是用一根线去测试一下它能够往后移多远
其实也差不多。
设h[i][j]代表在i,j往下能够拓展的最大长度。
l[i][j],r[i][j]分别代表从i,j往左,往右遇到的的第一个"R"的距离。
L[i][j],R[i][j]代表到这个阶段往左,往右遇到的第一个障碍。(设置这个变量的目的是因为到这一行能够拓展的范围还受上一行的影响,但是如果直接改变l[i][j],r[i][j]的话可能会影响到不选上一行的情况,所以就额外的开一个数组。像这一题 就不用考虑那么多啦)
初始化:
for(int i=1;i<=n;i++){int t=0;for(int j=1;j<=m;j++){if(a[i][j])l[i][j]=t;else L[i][j]=0,t=j;//将L[i][j]赋值为0是因为待会dp的时候l要去max,所以就直接赋为0}t=m+1;for(int j=m;j>=1;j--){if(a[i][j]) r[i][j]=t;else R[i][j]=m+1,t=j;//同理R待会要取min所以就赋值成为m+1}}
Code:
#include<bits/stdc++.h>
using namespace std;const int maxn = 1005;
int n,m,ans;
int a[maxn][maxn];int r[maxn][maxn],l[maxn][maxn],h[maxn][maxn],L[maxn][maxn],R[maxn][maxn];inline void DP()
{for(int i=1;i<=n;i++){int t=0;for(int j=1;j<=m;j++){if(a[i][j])l[i][j]=t;else L[i][j]=0,t=j;}t=m+1;for(int j=m;j>=1;j--){if(a[i][j]) r[i][j]=t;else R[i][j]=m+1,t=j;}}for(int i=1;i<=m+1;i++) R[0][i]=m+1;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(a[i][j]){h[i][j]=h[i-1][j]+1;L[i][j]=max(l[i][j]+1,L[i-1][j]);R[i][j]=min(r[i][j]-1,R[i-1][j]);ans=max(ans,(R[i][j]-L[i][j]+1)*h[i][j]);}
}int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){char x;cin>>x;if(x=='F') a[i][j]=1;else a[i][j]=0;}DP();printf("%d\n",3*ans);return 0;
}
对比一下这一题 可以发现,那个题不需要额外开数组的原因是,上下两个数不一样才会进行转移,如果上下两行都不同,那么它们就是大的矩阵。这样刚好可以覆盖所有情况。
而这一题,如果是1就会进行转移,假如不开额外数组的话就会GG。
栗子:
2 6
F F R R F F
F F F F F F
这样的话,最大的显然是最后一行,但是此时的黄色部分已经被“污染”了,
而中间的那两个1的上一行是0,所以它们的值无法更新到正确答案。!
(应该是这个原因吧)
【洛谷】P4147 玉蟾宫 解题报告相关推荐
- 洛谷 P4147 玉蟾宫 P1169 [ZJOI2007]棋盘制作(求最大子矩阵)
题目: P4147 玉蟾宫: https://www.luogu.org/problemnew/show/P4147 P1169 [ZJOI2007]棋盘制作: https://www.luogu. ...
- 洛谷P4147 玉蟾宫(单调栈解决)
题目 题目链接 题目背景 有一天,小猫 rainbow 和 freda 来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 题目描述 这片土地被分成 N\times ...
- 洛谷 P4147 玉蟾宫【悬线法/单调栈】
题目背景 有一天,小猫 rainbow 和 freda 来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 题目描述 这片土地被分成 N×MN\times MN×M ...
- 刷题记录:洛谷P4147玉蟾宫
传送门:洛谷 题目描述: 这片土地被分成 N × M N\times M N×M 个格子,每个格子里写着 'R' 或者 'F',R 代表这块土地被赐予了 rainbow,F 代表这块土地被赐予了 fr ...
- 洛谷 P4147 玉蟾宫
这好像是一道悬线法的题目,但是我不会,只能用单调栈水过了 我们将ai,ja_{i,j}ai,j定义为从(i,j)(i,j)(i,j)出发向上(坐标减小)可以达到的最长的.没有R的路径 比如说样例 5 ...
- 洛谷 P4147 玉蟾宫 题解【悬线dp】
原题地址 蛤,今天正好学习一下悬线dp,写了个板子题. 用 l [ i ] [ j ] l[i][j] l[i][j]表示能延伸的最左的位置的列, r [ i ] [ j ] r[i][j] r[i] ...
- 洛谷1056 排座椅 解题报告
洛谷1056 排座椅 本题地址: http://www.luogu.org/problem/show?pid=1056 题目描述 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头 ...
- 洛谷1067 多项式输出 解题报告
洛谷1067 多项式输出 本题地址: http://www.luogu.org/problem/show?pid=1067 题目描述 一元 n 次多项式可用如下的表达式表示: 其中,aixi称为 i ...
- 洛谷4147 玉蟾宫
题目背景 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 题目描述 这片土地被分成N*M个格子,每个格子里写着'R'或者'F ...
最新文章
- python pow和**_Python学习笔记 | 实例3:天天向上的力量
- C# String部分方法的例子StringBuilder的简单介绍
- Android笔记:防反编译、代码混淆中,解决第三方jar包不被混淆的一些心得,及gson防混淆方法...
- (60)逆向分析 KiSwapThread —— 找就绪线程和空闲线程
- python函数-函数进阶
- java类spring加载_spring的加载机制?
- 51单片机怎么显示当前时间_51单片机玩转物联网基础篇06-LCD1602液晶显示器
- 如何在linux下创建一个可运行shell脚本?
- (转)左耳朵耗子:技术人如何更好地把控发展趋势?
- 教你电脑微信多开方法,超级简单_多啦咪
- 畅想未来计算机300字,畅想未来作文300字5篇
- 基于麻雀算法的无人机航迹规划 - 附代码
- 睡个“好”觉,还真是有益身心胖瘦的
- veracrypt加密mysql_VeraCrypt怎么用 VeraCrypt加密文件的图文教程方法
- 从CVPR 2021的论文看计算机视觉的现状
- Etcd——大厂面试问题集合
- 刘强东不学编程,今天很可能没有京东......一位码农的发家致富史
- diy作品——3D扫描+打印
- 月薪5万,微软中国研究院最新面试题
- gerber学习总结
热门文章
- 主键主键外键和索引_主键和外键之间的区别
- Zotero 5.0 + 坚果云同步盘 + papership 配置教程
- 阿里云盾技术强在哪里?轻松防御DDoS、CC攻击 1
- selenium报错信息-- Python 中 ‘unicodeescape‘ codec can‘t decode bytes in position XXX: trun错误解决方案
- 小米扫地机器人粉尘盒_小米扫地机器人尘盒怎么打开
- 计算机强制关机后无法正常启动,win10系统强制关机后无法正常启动了如何解决...
- 计算机超级账号密码,获取光猫超级用户密码,自己动手分分钟搞定!
- 新坑首发《每晚一个恐怖的IT技术学习小故事》让我们一边学习技术,一边体验恐惧吧~
- hdu 4960 Another OCD Patient(动态规划)
- 第四十章 SQL命令 DROP USER