首页 > 其他分享 >P4147 玉蟾宫 题解

P4147 玉蟾宫 题解

时间:2023-12-20 22:34:54浏览次数:21  
标签:玉蟾 int 题解 sum 可控 宽度 当前 P4147 dp

P4147 玉蟾宫 题解

题目链接

P4147 玉蟾宫

简要思路

很容易发现,这是最大子矩形问题的板子题。

定义一个二维的 \(dp\) 数组,\(dp_{i,j}\) 代表以坐标 \((i,j)\) 为底的线段,最长能向上延伸多少个单位长度的 F(如果自身为 R,值则为 \(0\))。

对于 \(dp\) 数组的维护,分为两种情况:

  1. 当 \(a_{i,j}\) 为 F 时,\(dp_{i,j}=dp_{i-1,j}+1\);

  2. 否则当 \(a_{i,j}\) 为 R 时,\(dp_{i,j}\) 为默认值 \(0\)。

核心做法为单调栈,栈顶为最大值。栈内存储的值的类型为一个结构体,该结构体以列为中心,存储两个内容:当前的点最长向上延伸的 F 的单位长度 \(h\),和其对应的可控宽度 \(w\)。

具体操作过程如下:

  1. 枚举每一行,对每一行进行 solve 操作;

  2. 把该行的第一列作为起点压入栈中,进行单调栈操作;

  3. 维护一个变量 \(sum\),用于记录当前单调栈过程中弹出的元素的可控宽度之和;

  4. 枚举每一行,判断当前位置与栈顶的关系:

    • 如果当前栈顶 \(\geq\) 当前元素,我们维护当前可控宽度之和加上当前元素的可控宽度,那么此时的面积就是当前元素的高 \(h \times\) 当前之前弹出元素的可控宽度之和 \(sum\);

    • 否则直接压入栈中即可。

  5. 维护当前元素结构体中的信息:长度 \(h\) 为 \(dp\) 数组中相应位置的值,可控宽度 \(w\) 为当前弹出元素的可控宽度之和 \(sum + 1\)(因为要加上自己);

  6. 最后整行枚举完后,我们在遍历栈中剩余的元素,计算其面积并维护答案。

完整代码

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
const int MAXN=1005;

int n,m,maxn;
char c[MAXN][MAXN];
int dp[MAXN][MAXN];

struct node{
	int h,w;//长度和宽度
}a[MAXN];//以列为中心
std::stack<node> s;//存储类型为 node

void solve(int x){
	memset(a,0,sizeof(a));
	while(s.size())s.pop();//先清空
	
	a[1].h=dp[x][1],a[1].w=1;
	s.push(a[1]);//处理好每行的第一列元素
	
	for(int i=2;i<=m;i++){
		int sum=0;//当前可控宽度之和
		while(s.size()&&s.top().h>=dp[x][i]){//需要先弹出再压入
			sum+=s.top().w;//更新当前可控宽度之和
			maxn=std::max(maxn,s.top().h*sum);//计算当前面积
			s.pop();
		}
		a[i].h=dp[x][i],a[i].w=sum+1;//可控宽度加上自己
		s.push(a[i]);
	}
	
	int sum=0;
	while(s.size()){//处理栈中剩余的元素/矩形
		sum+=s.top().w;
		maxn=std::max(maxn,s.top().h*sum);
		s.pop();
	}
}

signed main(){
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);

	std::cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			std::cin>>c[i][j];
			if(c[i][j]=='F')dp[i][j]=dp[i-1][j]+1;//dp 数组的维护,为 R 则为默认值 0
		}

	for(int i=1;i<=n;i++)solve(i);//对于每一行解决子问题
	std::cout<<maxn*3<<endl;//注意 *3
	return 0;
}

标签:玉蟾,int,题解,sum,可控,宽度,当前,P4147,dp
From: https://www.cnblogs.com/CheZiHe929/p/17917773.html

相关文章

  • THUPC 2024 初赛部分题解和游记
    我们队赛时被J题创死了awa离做出来差一个剪枝,而且赛后试了试不加剪枝甚至能过……6题离场。一些题解J套娃先对\([0,n]\)中每个数\(k\)分别考虑。假设总共出现了\(c\)次\(k\),第\(i\)次出现的位置是\(pos_{i}\),(令\(pos_0=0,pos_{c+1}=n+1\)),则只有处在\(pos_{......
  • 软件测试/测试开发|selenium NoSuchDriverException问题解决
    前言我们在使用selenium进行web自动化测试时,有时候会遇到NoSuchDriverException的问题,这个异常通常是由于WebDriver无法找到指定的浏览器驱动而引起的。在这篇文章中,我们将讨论NoSuchDriverException的原因以及如何解决这个问题。NoSuchDriverException是什么?NoSuchDriverException......
  • 华中师范大学2023新生赛 I 镜面折跃 题解
    Link华中师范大学2023新生赛I镜面折跃Question懒得转述了Solution确实是一道好题可以把一节方格拆成\(4\)个点,每个点分别代表从四个方向射进这个节点的光线如果没有镜子,那么就左侧节点的右侧连接自己的右侧,以此类推如果有镜子,那么顺着镜子方向建边,边权为\(0\),向\(9......
  • 题解 Gym 102341B【Bulbasaur】/ SS231107C【爬梯高手】
    题解SS231107C【爬梯高手】撞原了,好耶!Gym102341B顺便把我的变异加强版爆标了!!!problem有一个\(n*m\)个点的有向分层图,共有\(n\)层,每层\(m\)个点,每条边一定是从第\(i\)层连向第\(i+1\)层。定义\(f(i,j)\)表示选择若干条路径,每条路径从第\(i\)层出发,在第\(j\)......
  • U388010 题解
    洛谷U388010题解link:https://www.luogu.com.cn/problem/U388010Sol首先,我们看到这一条件:对于每一个\(1\lei\len\),\(1\lej\len\),\(i\neqj\)满足\(a_i\bmoda_j\neq0,\a_j\bmoda_i\neq0\)。我们知道,质数的因数只有\(1\)和本身,所以当序列里全是质数......
  • 下载图片中文乱码问题解决记录
    1.问题背景需求需要做一个场所码下载的需求,后端接口实现使用的是AWT[1]。在本地Windows开发环境联调接口一切正常,当部署到测试环境Linux服务器上之后,前端同事反馈下载的图片如下:这个问题其实不能算是乱码,而是字体缺失,图片中的汉字使用了微软雅黑字体,而测试环境使用的是docker部......
  • CF1914 G Light Bulbs 题解
    LinkCF1914GLightBulbsQuestion有\(2n\)盏灯摆放在一条直线上,每盏灯有一个颜色\(a_i\),灯的颜色一共有\(n\)种,每个颜色的颜色的灯刚好两盏,灯开始都是熄灭的。你选择几盏灯先打开,然后通过以下规则让其他的灯打开选择\(i,j\)是相同颜色的,一盏亮,一盏不亮,你可以使两盏......
  • 阿里云ECS自建K8S_IPV6重启后异常问题解决过程
    阿里云ECS自建K8S_IPV6重启后异常问题解决过程背景最近安装了一个单节点的K8S_IPV6昨天不知道何故突然宕机了.然后只能在阿里云的控制台后台重启了ECS启动之后看K8S的状态一开始是正常的.但是查看ing的时候,发现IP地址却变成了IPV4的地址,感觉比较奇怪.这里整理一下......
  • CF1872C-Non-coprime-Split-题解
    title:CF1872CNon-coprimeSplit题解date:2023-09-1821:09:14categories:-题解一个很怪的分讨想法。当\(l\neqr\)时,区间内一定有一个偶数。设最大的偶数为\(x\),那么当\(x>2\)时,可以得到一组解\((2,x-2)\),此时\(\gcd(2,x-2)=2\)。当\(l=r\)时,问题......
  • CF1870B-Friendly-Arrays-题解
    title:CF1870BFriendlyArrays题解date:2023-09-2010:32:12categories:-题解翻译给出长度为\(n\)的序列\(a\)和长度为\(m\)的序列\(b\),选出\(b\)中的任意个数(可以不选),让\(a\)的每个数都或上它们,求\(a_1\oplusa_2\oplus\dots\oplusa_n\)的最大值......