这片土地被分成 \(N×M\) 个格子,每个格子里写着 'R' 或者 'F',R 代表这块土地被赐予了 rainbow,F 代表这块土地被赐予了 freda。

现在 freda 要在这里卖萌。。。它要找一块矩形土地,要求这片土地都标着 'F' 并且面积最大。

但是 rainbow 和 freda 的 OI 水平都弱爆了,找不出这块土地,而蓝兔也想看 freda 卖萌(她显然是不会编程的……),所以它们决定,如果你找到的土地面积为 \(S\),它们每人给你 \(S\) 两银子。

这道题,我们可以想一下,矩形的面积跟 \(2\) 条边有关。

对于每个点,我们算出 \(3\) 个数,lftrgtup

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 【玉蟾宫】相关推荐

  1. 【洛谷】P4147 玉蟾宫 解题报告

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

  2. [P4147 玉蟾宫(悬线法)

    题目链接: P4147 玉蟾宫 题目大意: n ∗ m n∗m n∗m的矩阵,求最大的全 F F F矩阵面积 ∗ 3 *3 ∗3. 思路:悬线法. 参考代码: #include <bits/st ...

  3. 洛谷 P4147 玉蟾宫 P1169 [ZJOI2007]棋盘制作(求最大子矩阵)

    题目: P4147 玉蟾宫: https://www.luogu.org/problemnew/show/P4147  P1169 [ZJOI2007]棋盘制作: https://www.luogu. ...

  4. 洛谷P4147 玉蟾宫(单调栈解决)

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

  5. 洛谷 P4147 玉蟾宫【悬线法/单调栈】

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

  6. P4147 玉蟾宫 题解

    博客园同步 原题链接 简要题意: 求最大 000 矩阵.(将字符转化为数字) 本题是模板题,可以用来爆踩.??? 悬线法 来了! 其中绿色是 000,红色是 111. 下面以这个图为例讲一下算法流程. ...

  7. 洛谷 P4147 玉蟾宫 题解【悬线dp】

    原题地址 蛤,今天正好学习一下悬线dp,写了个板子题. 用 l [ i ] [ j ] l[i][j] l[i][j]表示能延伸的最左的位置的列, r [ i ] [ j ] r[i][j] r[i] ...

  8. 刷题记录:洛谷P4147玉蟾宫

    传送门:洛谷 题目描述: 这片土地被分成 N × M N\times M N×M 个格子,每个格子里写着 'R' 或者 'F',R 代表这块土地被赐予了 rainbow,F 代表这块土地被赐予了 fr ...

  9. Luogu P4147 玉蟾宫

    题目 就是全0子矩阵. 先预处理每个点上面有多少个连续的0(包括自己). 然后我们枚举下边界(1-n). 我们开一个单调栈,记录一个上界递增的矩形集合. 如果我们扫到了一个比当前栈顶要矮的矩形,那么我 ...

  10. 洛谷 P4147 玉蟾宫

    这好像是一道悬线法的题目,但是我不会,只能用单调栈水过了 我们将ai,ja_{i,j}ai,j​定义为从(i,j)(i,j)(i,j)出发向上(坐标减小)可以达到的最长的.没有R的路径 比如说样例 5 ...

最新文章

  1. 数据表迁移数据一致性验证
  2. 学习响应式BootStrap来写融职教育网站,Bootsrtap第十三天讲师列表栏目
  3. Oracle:FOR循环语句练习
  4. python中cmd全称_【转】Python中执行cmd的三种方式
  5. 数据结构与算法-二叉树的名词概念与相关数据的计算
  6. C语言和数据结构_1
  7. IE浏览器中访问jsp页面,页面不执行ajax请求,后台控制台报错
  8. 大规模数据生成 (500万条数据)
  9. jquery利用appendTo动态创建元素
  10. html英文期刊参考文献,外文期刊参考文献标准格式
  11. 浙江大学计算机图形学视频教程,浙江大学现代教务管理系统
  12. 记小程序uniapp 语音播放
  13. Mysql索引失效OR语句
  14. 用esp8266开发板制作WiFi Killer
  15. N32G430学习笔记1-工程模板建立
  16. 推荐一个国学资源分享、学术交流网站:龙腾网
  17. linux刻录文件,linux中刻录iso到光盘
  18. 港中深、华为联合培养,韩晓光课题组招收三维视觉数字人方向博士生
  19. vue+element ui 项目 后台管理系统
  20. KLayout教程(一)画不同的形状

热门文章

  1. 什么是市盈率 什么是市盈率的概念
  2. 大城市灯红酒绿,海伦司靠一杯酒如何建起护城河?
  3. 第四章:迭代器与生成器
  4. 如何获取有价值的用户反馈?
  5. idea 修改项目名称的方法
  6. Android--Recovery模块之恢复出厂设置
  7. 微信公众号修改业务域名、JS接口安全域名、网页授权域名
  8. python数据分析与挖掘实战(2)帕累托法则菜品盈利分析与相关性分析
  9. saas系统需要什么样的云服务器,SAAS系统和云服务器的区别
  10. Creo Illustrate动画制作视频教程