题解:AT_agc050_b [AGC050B] Three Coins

news/2025/10/14 0:01:46/文章来源:https://www.cnblogs.com/JohnYam/p/19128450

传送门

注:如无特殊说明,本篇题解中所有的序列,均用红色标示已经放置硬币的位置。若本次操作为拿走硬币,用蓝色标示本次操作拿走的硬币的位置,用黑色标示从未放过硬币或放置过硬币且在本次操作之前的操作中被拿走的位置。

根据题意和数据范围,不难想到本题的做法是区间 DP。然而难点在于刻画放置和拿走硬币这两个操作。

举个例子,考虑序列 \([\textcolor{red}5,\textcolor{red}4,\textcolor{red}{-2},-3,-1,6]\),其中前三个位置放置了硬币。此时的分数和是 \(7\),还能不能更大呢?

考虑先将后三个位置也放上硬币,然后再将第 \(3\sim5\) 个位置的硬币拿走,序列状态变化为:\([\textcolor{red}{5},\textcolor{red}{4},\textcolor{red}{-2},\textcolor{red}{-3},\textcolor{red}{-1},\textcolor{red}{6}]\to [\textcolor{red}{5},\textcolor{red}{4},\textcolor{blue}{-2},\textcolor{blue}{-3},\textcolor{blue}{-1},\textcolor{red}{6}]\to[\textcolor{red}5,\textcolor{red}4,-2,-3,-1,\textcolor{red}6]\),两步操作后的分数和分别是 \(9\)\(15\)

我们发现如上操作的实质是把第 \(3\) 个位置的硬币移动到第 \(6\) 个位置。类似地可以推断出,第 \(i\) 个位置的硬币只能由第 \(i±3k\) 个位置的硬币移动而来。

如果只进行这一步转化,还不足以分析出区间合并的方法。因此,我们再考虑一个序列 \([9,-5,-3,\textcolor{red}{-2},\textcolor{red}7,\textcolor{red}{-1},-6,-4,8]\),其中第 \(4\sim 6\) 个位置放置了硬币。此时的分数之和是 \(4\),还能不能更大呢?

考虑如下的序列状态变化:\( [9,-5,-3,\textcolor{red}{-2},\textcolor{red}7,\textcolor{red}{-1},-6,-4,8]\to[\textcolor{red}9,\textcolor{red}{-5},\textcolor{red}{-3},\textcolor{red}{-2},\textcolor{red}7,\textcolor{red}{-1},-6,-4,8]\to[\textcolor{red}9,\textcolor{blue}{-5},\textcolor{blue}{-3},\textcolor{blue}{-2},\textcolor{red}7,\textcolor{red}{-1},-6,-4,8]\to[\textcolor{red}9,-5,-3,-2,\textcolor{red}7,\textcolor{red}{-1},\textcolor{red}{-6},\textcolor{red}{-4},\textcolor{red}8]\to[\textcolor{red}9,-5,-3,-2,\textcolor{red}7,\textcolor{blue}{-1},\textcolor{blue}{-6},\textcolor{blue}{-4},\textcolor{red}8]\to[\textcolor{red}9,-5,-3,-2,\textcolor{red}7,-1,-6,-4,\textcolor{red}8] \)。每一步操作后的分数和分别是 \(5,15,13,24\)

观察到我们可以通过放置和拿走硬币操作的组合,把连续放置的 \(3\) 个硬币拆开,使左边的位置为 \(i\) 的硬币移动到 \(i-3\),中间的位置为 \(j\) 的硬币不动,右边的位置为 \(k\) 的硬币移动到 \(k+3\)。这样我们就推导出了区间合并的方法。

\(f_{l,r}\) 表示区间 \([l,r]\) 能得到的最大分数和。对于一个长度为 \(3\) 的倍数的区间 \([l,r]\),枚举断点 \(i\),如果区间 \([l+1,i-1]\)\([i+1,r-1]\) 的长度都是 \(3\) 的倍数,也即位置为 \(l\)\(r\) 的硬币都能够分别移动到 \(i-1\)\(i+1\) 的位置,那么就有 \(f_{l,r}=\max(f_{l,r},f_{l+1,i-1}+f_{i+1,r-1}+a_l+a_i+a_r)\)。对于所有区间,都套路地进行 \(f_{l,r}=\max(f_{l,r},f_{l,i}+f_{i+1,r})\) 的转移。

最终的答案就是 \(f_{1,n}\),时间复杂度 \(O(n^3)\)

#include <bits/stdc++.h>
using namespace std;
const int N = 510;
int n, a[N], f[N][N];
int main () {cin >> n;for (int i = 1; i <= n; ++i)cin >> a[i];for (int len = 1; len <= n; ++len)for (int l = 1, r = l + len - 1; r <= n; ++l, ++r) {if (len % 3 == 0)for (int i = l + 1; i < r; ++i) {if ((i - l + 1) % 3 != 2 || (r - i + 1) % 3 != 2)continue;f[l][r] = max(f[l][r], f[l + 1][i - 1] + f[i + 1][r - 1] + a[l] + a[i] + a[r]);}for (int i = l; i < r; ++i)f[l][r] = max(f[l][r], f[l][i] + f[i + 1][r]);}cout << f[1][n];return 0;
}

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

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

相关文章

go:generate 指令

gogenerate 指令 go generate 命令是在Go语言 1.4 版本里面新添加的一个命令,当运行该命令时,它将扫描与当前包相关的源代码文件,找出所有包含 //go:generate 的特殊注释,提取并执行该特殊注释后面的命令。 命令格…

光栅化

光栅化 Rasterrization—光栅化(三角形的离散化) 屏幕(Screen)在图形学我们可以被抽象为一个二维数组,其中二维数组中的每个元素是像素( pixel )。 屏幕空间(screen space)是由数组构成的平面坐标系,每一个像…

图形学中的变换

图形学中的变换 二维变换 缩放变换(Scale)如上图,如果想把一个图形缩小为原来的0.5倍,那么就需要x坐标变为0.5倍,y坐标也变为0.5倍,可以用以下表达式表示这两个表达式可以用矩阵的形式表示如下Sx表示在x轴方向上…

Unity URP 体积云

Unity URP 体积云 ​ 好久之前开的体积云,因为期末考试和过年拖了很久,这几天才算整完。记录一样实现的思路,方便日后忘记了回来复习。 ​ 云的渲染有多种实现方法,我实现的是基于RayMarching的体积云体渲染,也…

使用DirectX绘制天空盒并实现破坏和放置方块

使用DirectX绘制天空盒并实现破坏和放置方块 绘制天空盒 由于项目中的DxTex软件使用不了,所以直接使用了方法二,将项目中的文件名直接修改,不过这里要注意获取的六个正方形贴图要用正确的顺序读取,也就是+X,-X,+…

编写DX12遇到的坑

编写DX12程序遇到的坑 ​ 写DX12每次遇到Bug都会卡好久,结果大部分时候最后都发现是一些小问题导致的,故将自己遇到的坑都写下来,方便后续遇到时回头查阅。 使用ClearDepthStencil清理DepthBuffer的时候把其他资源…

编写DX12时使用的辅助类

编写DX12时使用的辅助类 有一段时间没有学DX12,导致很多东西都忘了,跟着教程里写的东西还好,略看一遍教程就想起来的,但是自己封装的很多类就算写了注释过了一段时间也基本忘光,而且翻来翻去的也不方便,为了快速…

HLSL语法

语义 语义的概念语义xxxx:+ 大写单词,是用来限定输入值的来源、输出值的去向,其中那些大写单词都是系统提供的,我们需要用他们去填充我们的参数,然后传到顶点着色器和片元着色器中,进行进一步的计算,最后再通过…

DirectX12初始化

DirectX12初始化 这几天跟着龙书把dx12的初始化过了一遍,写点东西记一下,免得之后又忘了。 创建d3d设备 d3d设备相当于对显示适配器的抽象,显示适配器一般为显卡,也可由软件来模拟。可通过下列接口来创建一个d3d设…

用Vmware ESXI6.7离线包封装网卡驱动

用Vmware ESXI6.7离线包封装网卡驱动本来想装最新版的Vmware ESXI9.0的,但安装时提示找不到网卡无法安装,于是在网上搜索一番,发现可以用离线升级包封装网卡驱动的办法进行安装,但由于我的网卡是Realtek瑞昱RTL811…

CF2159B

Sol 假设 \(n<m\)。 考虑枚举列,然后对于每个位置分别做。 但是这非常难做,然后我们考虑包含 \([l,r]\) 这几行的最小矩形,然后发现这个东西可以在枚举列的时候同时计算,然后就做完了。 Code Link。

登录校验---Filter过滤器

过滤器(Filter)概念: Filter 过滤器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。 过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。 过滤器一般完成一些通用的操作,比如: 登录校验、统一编码…

环境变量 Path 配置实战指南:从“能用”到“专业”--两种配置环境变量的方法

本指南将通过一个完整的实例,手把手教你如何配置 `Path` 环境变量。我们将超越“如何做”,深入探讨“为什么这么做”,让你彻底理解直接路径与引用路径的本质区别。我们将以配置 Java 开发环境为例,让你清晰地看到每…

10月13日

上午建模语言和数据结构课程 下午听讲Java知识点和练习数据库

Ubuntu22.04安装CH340/CH341驱动

转载自: 陈拓 2024/12/20-2024/12/20 https://zhuanlan.zhihu.com/p/137683332711. 我的系统硬件系统架构arch操作系统版本lsb_release -a2. CH340G,USB-串口转换器3. Ubuntu22.04安装CH340驱动 3.1 用lsusb查看USB插…

玄机蓝队靶场_应急响应_198:实战Live勒索病毒溯源排查

前言: 版权作者:思而听(山东)网络科技有限公司、solar应急响应团队、州弟学安全 特别注意:环境中的勒索家族全版本加密器已被 solar应急响应团队 破解 系统:Windows server 2016 账号密码:administrator/Sierting…

JetBrains Mono字体好看、及其它

请注意箭头。还有输入的是grep != 另外,进到那个深深的目录里后,可以: ln -s `readlink -f .` somewhere 目录不能有hard link,原因可问AI.

STM32——UART

UART通信协议(串口通信) 1、两根通信线(发送和接收),TX与RX要交叉连接。只需进行单向通讯时可只连接一根通信线。 2、仅支持点对点的通信,不像I2C、SPI支持一对多通信。 3、进行通信的两设备电平标准必须一致,当…

WebApi 交叉观察者- IntersectionObserver复盘

交叉观察者- IntersectionObserver复盘 一、 Intersection Observer是什么? Intersection Observer API 提供了一种异步观察目标元素与祖先元素或视口交叉状态的方法。通俗地说,就是可以高效地监测一个元素是否进入或…