P4147 玉蟾宫

news/2025/3/4 23:07:25/文章来源:https://www.cnblogs.com/grz0306/p/18751709

这里介绍悬线法。

原题

笔者注:笔者在学习了悬线法之后不免存在一些疑问,留给后续探讨和思考。

  • 代码的实现部分是否存在没有判断仅仅存在一行的情况?然而通过了luogu的数据。

1.思想

悬线法的核心思想是计算出对于当前一行能够向左/向右可以取到的最大值,处理出闭区间后并考虑出这段区间长度可以向上扩展出的最大高度是多少,每次计算更新当前能达到的区间,取出最大值,进行计算;对于一个非障碍格,可以延申出一条一直往上延伸的,碰到障碍格或上边界则停止的线,这条线往往被称之为"悬线"。我们的目的就是模拟这个过程实现。

2.实现

一个奶龙的做法是直接暴力,不再赘述。

考虑预处理出每一行能够达到的最左和最右。
令:

\(l_{i,j}\)表示对于\((i,j)\)这一个位置这一行最多可以向左扩展到的格子,
\(r_{i,j}\)表示对于\((i,j)\)这一个位置这一行最多可以向右扩展到的格子。
\(h_{i,j}\)表示悬线的最大长度。

接下来,对于每一个非障碍格,计算他的悬线可以往左或往右的最远情况,当这个格子是非障碍格,且他的上方也是,如果上方的\(l\)值更大,则更新为上方的\(l\)值;\(r\)数组同理,如果上方的\(r\)值更小,则更新为上方的\(r\)值,\(h\)数组的更新则每次找到一个上方的就\(+1\),无需考虑\(l\)\(r\)。对于初始化部分,停下自行思考一下,较为简单。这样就好办了,只需要代码实现就可以了,贴一份。

3.代码

# include <bits/stdc++.h>
using namespace std;
const int N = 1010;
char s[N][N];
int l[N][N],r[N][N],h[N][N];
int main (){int n,m;scanf("%d%d",&n,&m);for(int i = 1;i <= n;i++){for(int j = 1;j <= m;j++){cin >> s[i][j];h[i][j] = 1,l[i][j] = r[i][j] = j;}}for(int  i = 1;i <= n;i++){for(int j = 2;j <= m;j++){if(s[i][j] == 'F' && s[i][j-1] == 'F'){l[i][j] = l[i][j-1];}}for(int j = m-1;j >= 1;j--){if(s[i][j] == 'F' && s[i][j+1] == 'F'){r[i][j] = r[i][j+1];}}}int mx = 0;for(int i = 1;i <= n;i++){for(int j = 1;j <= m;j++){if(i > 1 && s[i][j] == 'F'){if(s[i-1][j] == 'F'){h[i][j] = h[i-1][j]+1;if(l[i][j] < l[i-1][j]){l[i][j] = l[i-1][j];}if(r[i][j] > r[i-1][j]){r[i][j] = r[i-1][j];}}mx = max(mx,(r[i][j]-l[i][j]+1)*h[i][j]);}}}int ans = mx*3;printf("%d\n",ans);return 0;
}

4.个人总结

主要的错误点在于对于\(mx\)那里的计算出了问题,我将他放在了第二个\(if\)里面,这显然是错误的,因为我们没有考虑到只针对于答案恰好是一行的某一段\(F\),然而数据较为乐观,我们拿下了\(92pts\),如果放在里面就在程序的最后跑一边最大值就ok了。同样这样似乎也可以解决我在开头提出的问题,思路较为清晰。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/893682.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我的Redission使用初体验

本文记录作者第一次使用Redission实现分布式锁的体验。对于碰到的问题进行了一些总结。当我们实际使用redis手写实现分布式锁时,会产生不可重入、不可重试、超时释放和主从一致的问题,此时redission为我们提供的锁完美达成以上要求,适合我们生产时使用。Redisson的实际使用 …

Power Automate 格式化JSON时字段为空

前言最近,在使用Power Automate处理JSON的时候,碰到一个错误。正文1.处理JSON的过程,一般是这样的,如下图:2.测试一下,这样,我们就很容易操作JSON字符串中的属性了,如下图:3.但是,大家在开发中,碰到过这样的问题没有?4.详细的错误信息,如下图:[{"message&qu…

ChromaDB

ChromaDB是一个开源的嵌入式向量数据库,专为存储和查询高维向量数据而设计,特别适用于与大型语言模型(LLMs)和嵌入模型(Embeddings)相关的应用场景 安装pip install chromadb启动服务chroma run --path ./chroma_data --host 0.0.0.0 --port 8000说明: --path ./chroma_…

如何为 Power Automate 配置 Azure Key Vault 权限

前言最近,在Power Automate中使用Azure Key Vault,然后,就需要配置一下AKV的权限。正文1.我们在Azure Portal里新建一个Key vault,如下图:2.进入Access policies,点击Create,如下图:3.如果只是为Power Automate使用,只需要勾选红框的权限就好,如下图:4.搜索需要的服…

P2671 [NOIP 2015 普及组] 求和

好题,思想很好。 首先看到这个题一个显然的思路是\(O(n^3)\)的暴力,直接枚举三个判断可行性计算贡献。 思考简单的优化,题目条件限制z-y=y-x变形可得\(y=\frac{z-x}{2}\),由于\(y\)一定是正整数,所以\(z\)与\(x\)正负性相同,考虑将原数组拆分为奇数和偶数两个集合,并在两…

web开发 辅助学习管理系统开发日记 day8

今日完成员工上传头像功能,删除员工功能,以及调试阿里云oss服务器。 Q1:如何配置阿里云服务器 1.创建阿里云服务器并且搭建好配置 2.引入依赖 在oss简介首页引入 3.从官网复制粘贴出上传文件这个功能所在工具类 4.在控制层里面进行上传 Q2 批量删除员工功能 1.在controller层…

pycharm添加conda环境的解释器时找不到python.exe

pycharm添加conda环境的解释器时找不到python.exe 先找到 anaconda 安装目录下的 condabin/conda ,然后加载环境, 加载之后下面就有了conda环境,可以进行选择

md5.exe WriteUp

WriteUp 题目信息 名称:md5.exe 分类:Reverse 描述:找到程序的flag题目链接: https://pan.baidu.com/s/1u8bGbKcUF6_gLaw63L3jyA?pwd=h8r5 提取码: h8r5解题思路 首先用DIE查看该文件,发现该文件没有壳,且是32位exe文件。所以可以直接用32位IDA打开该文件,并按F5对main函…

xor.exe WriteUp

WriteUp 题目信息 名称:xor.exe 分类:Reverse 描述:找到程序的flag题目链接: https://pan.baidu.com/s/1u8bGbKcUF6_gLaw63L3jyA?pwd=h8r5 提取码: h8r5解题思路 首先用DIE查看该文件,发现该文件没有壳,且是32位exe文件。所以可以直接用32位IDA打开该文件,并按F5对main函…

原型链图

啥都不说,先上图:上面展示了各个对象之间是怎样通过显式原型(prototype)及隐式原型([[prototype]],通过__proto__访问)来串联起来的。

【C++库函数】C++生成高质量随机数的方法

#include <iostream> #include <random>int main() {// 第一步:初始化真随机种子(使用硬件熵源)std::random_device rd; // 第二步:选择高性能引擎(推荐 mt19937)std::mt19937 gen(rd()); // 用 random_device 的输出来种子初始化引擎// 第三步:定义分布(…

20250305

1 烧碱的C浪回调后 开始布局中线多单。