题解 P4147 【玉蟾宫】
这片土地被分成 \(N×M\) 个格子,每个格子里写着 'R' 或者 'F',R 代表这块土地被赐予了 rainbow,F 代表这块土地被赐予了 freda。
现在 freda 要在这里卖萌。。。它要找一块矩形土地,要求这片土地都标着 'F' 并且面积最大。
但是 rainbow 和 freda 的 OI 水平都弱爆了,找不出这块土地,而蓝兔也想看 freda 卖萌(她显然是不会编程的……),所以它们决定,如果你找到的土地面积为 \(S\),它们每人给你 \(S\) 两银子。
这道题,我们可以想一下,矩形的面积跟 \(2\) 条边有关。
对于每个点,我们算出 \(3\) 个数,lft
、rgt
、up
。
lft
:即此点最多能向左延伸到哪一列。(初值为j
)for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(a[i][j]&&a[i][j-1])lft[i][j]=lft[i][j-1];
rgt
:即此点最多能向右延伸多少哪一列。(初值为j
)for(int i=1;i<=n;i++)for(int j=m;j>=1;j--)if(a[i][j]&&a[i][j+1])rgt[i][j]=rgt[i][j+1];
up
:即此点最多能向上延伸多少个格子数。(初值为1
)边 \(dp\) 边求。
现在我们就说说 \(dp\) 吧。
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){if(a[i][j]&&a[i-1][j]){lft[i][j]=max(lft[i-1][j],lft[i][j]);//在up最优的情况下,左端点的距离要更新rgt[i][j]=min(rgt[i-1][j],rgt[i][j]);//在up最优的情况下,右端点的距离要更新up[i][j]=up[i-1][j]+1;}int x=rgt[i][j]-lft[i][j]+1;ans=max(ans,x*up[i][j]);}
其实就是找高度最高的矩形,为什么这样是正确的呢。
我们可以这样想一下。我们的算法本质就是,以 \(i,j\) 最多往上的长度做矩阵一条边,这个就是 \(up_{i,j}\) 干的事情,然后 \(lft_{i,j}\) 和 \(rgt_{i,j}\) 则是要在 \(up_{i,j}\) 最优的情况下,让另一条边也最优。
你可以再想一下,下面这张图,最大子矩阵是橙色方框圈起来的。我们可以发现,最大子矩阵的四条边,每条边要么是靠到边界,要么是靠到障碍物。也就是说,最大子矩阵的上边界一定会靠到障碍物或边界。我们的算法就相当于确定了下边界,然后用 \(up\) 数组又确定了上边界。然后用 \(lft\) 和 \(rgt\) 确定左边界和右边界。
如果还是不懂的话,可以再想一下,我来模拟一下。
这就是我们 \(up\) 做的事。
然后呢,对于每条线,我们要让他们的上边界尽可能的长。
再回来看看代码:
#include <bits/stdc++.h>
using namespace std;
template<typename T>inline void read(T &FF){T RR=1;FF=0;char CH=getchar();for(;!isdigit(CH);CH=getchar())if(CH=='-')RR=-1;for(;isdigit(CH);CH=getchar())FF=(FF<<1)+(FF<<3)+(CH^48);FF*=RR;
}
template<typename T>void write(T x){if(x<0)putchar('-'),x*=-1;if(x>9)write(x/10);putchar(x%10+48);
}
int a[2010][2010],lft[2010][2010],rgt[2010][2010],up[2010][2010],ans;
int main(){int n,m;read(n);read(m);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){char ch;cin>>ch;if(ch=='F')a[i][j]=1;lft[i][j]=j;rgt[i][j]=j;up[i][j]=1;}for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(a[i][j]&&a[i][j-1])lft[i][j]=lft[i][j-1];for(int i=1;i<=n;i++)for(int j=m;j>=1;j--)if(a[i][j]&&a[i][j+1])rgt[i][j]=rgt[i][j+1];for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){if(a[i][j]&&a[i-1][j]){lft[i][j]=max(lft[i-1][j],lft[i][j]);rgt[i][j]=min(rgt[i-1][j],rgt[i][j]);up[i][j]=up[i-1][j]+1;}int x=rgt[i][j]-lft[i][j]+1;ans=max(ans,x*up[i][j]);}write(ans*3);return 0;
}
是不是就懂了\(qwq\)。。。
我才不告诉你,这个其实就是单调队列
题解 P4147 【玉蟾宫】相关推荐
- 【洛谷】P4147 玉蟾宫 解题报告
[洛谷]P4147 玉蟾宫 解题报告 题目背景 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 题目描述 这片土地被分成N* ...
- [P4147 玉蟾宫(悬线法)
题目链接: P4147 玉蟾宫 题目大意: n ∗ m n∗m n∗m的矩阵,求最大的全 F F F矩阵面积 ∗ 3 *3 ∗3. 思路:悬线法. 参考代码: #include <bits/st ...
- 洛谷 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 玉蟾宫 题解
博客园同步 原题链接 简要题意: 求最大 000 矩阵.(将字符转化为数字) 本题是模板题,可以用来爆踩.??? 悬线法 来了! 其中绿色是 000,红色是 111. 下面以这个图为例讲一下算法流程. ...
- 洛谷 P4147 玉蟾宫 题解【悬线dp】
原题地址 蛤,今天正好学习一下悬线dp,写了个板子题. 用 l [ i ] [ j ] l[i][j] l[i][j]表示能延伸的最左的位置的列, r [ i ] [ j ] r[i][j] r[i] ...
- 刷题记录:洛谷P4147玉蟾宫
传送门:洛谷 题目描述: 这片土地被分成 N × M N\times M N×M 个格子,每个格子里写着 'R' 或者 'F',R 代表这块土地被赐予了 rainbow,F 代表这块土地被赐予了 fr ...
- Luogu P4147 玉蟾宫
题目 就是全0子矩阵. 先预处理每个点上面有多少个连续的0(包括自己). 然后我们枚举下边界(1-n). 我们开一个单调栈,记录一个上界递增的矩形集合. 如果我们扫到了一个比当前栈顶要矮的矩形,那么我 ...
- 洛谷 P4147 玉蟾宫
这好像是一道悬线法的题目,但是我不会,只能用单调栈水过了 我们将ai,ja_{i,j}ai,j定义为从(i,j)(i,j)(i,j)出发向上(坐标减小)可以达到的最长的.没有R的路径 比如说样例 5 ...
最新文章
- 数据表迁移数据一致性验证
- 学习响应式BootStrap来写融职教育网站,Bootsrtap第十三天讲师列表栏目
- Oracle:FOR循环语句练习
- python中cmd全称_【转】Python中执行cmd的三种方式
- 数据结构与算法-二叉树的名词概念与相关数据的计算
- C语言和数据结构_1
- IE浏览器中访问jsp页面,页面不执行ajax请求,后台控制台报错
- 大规模数据生成 (500万条数据)
- jquery利用appendTo动态创建元素
- html英文期刊参考文献,外文期刊参考文献标准格式
- 浙江大学计算机图形学视频教程,浙江大学现代教务管理系统
- 记小程序uniapp 语音播放
- Mysql索引失效OR语句
- 用esp8266开发板制作WiFi Killer
- N32G430学习笔记1-工程模板建立
- 推荐一个国学资源分享、学术交流网站:龙腾网
- linux刻录文件,linux中刻录iso到光盘
- 港中深、华为联合培养,韩晓光课题组招收三维视觉数字人方向博士生
- vue+element ui 项目 后台管理系统
- KLayout教程(一)画不同的形状