(区间 dp)洛谷 P6879 JOI2020 Collecting Stamps 3 题解

news2025/4/23 9:42:33

题意

给定一个周长为 L L L 的圆,从一个点出发,有 N N N 个黑白熊雕像,编号为 1 1 1 N N N,第 i i i 个雕像在顺时针 X i X_i Xi 米处,如果你没有在 T i T_i Ti 秒内收集到这个黑白熊雕像,那么这个雕像就会发出“唔噗噗噗”的声音然后爆炸。

现在 JOI 君在这个点,他每秒可以移动 1 1 1 米,顺时针或者逆时针的移动都是允许的。

JOI 君想问,他最多能收集到多少个黑白熊雕像?

1 ≤ N ≤ 200 1 \le N \le 200 1N200 2 ≤ L ≤ 1 0 9 2 \le L \le 10^9 2L109 1 ≤ X i < L 1 \le X_i<L 1Xi<L X i < X i + 1 X_i < X_{i+1} Xi<Xi+1 0 ≤ T i ≤ 1 0 9 0 \le T_i \le 10^9 0Ti109

思路

首当其冲破环成链。

发现可以顺时针或逆时针走,即可以停在区间的左或者右去收集雕塑。在洛谷 P1220 关路灯中同样是这样的套路,所以考虑朴素地设 f i , j , o p f_{i,j,op} fi,j,op 表示收集区间在 [ i , j ] [i,j] [i,j] 的雕塑,收集完之后要停在左或右端点,可以收集到最大雕塑数量。

但是这一题还有一个时间限制,要在特定的时间点之前(包括这个时间点)收集到特定的雕塑,不一定能将区间 [ i , j ] [i,j] [i,j] 的雕塑全部收集完。因此我们改变一下状态,是贡献与时间挂钩:设 f i , j , k , o p f_{i,j,k,op} fi,j,k,op 表示收集区间 [ i , j ] [i,j] [i,j] 的雕塑,收集了 k k k 个,收集完之后停在左或右端点,花费的最小时间。

因为在起点也可以顺时针和逆时针走,所以我们设破环成链之后的 n + 1 n+1 n+1 号点为起点,左圈逆时针为 n ∼ 1 n\sim 1 n1,右圈顺时针为 n + 2 ∼ 2 n + 1 n+2\sim 2n+1 n+22n+1

初始化 x n + 1 = L , t n + 1 = 0 x_{n+1}=L,t_{n+1}=0 xn+1=L,tn+1=0 f f f 极大值。

从一开始在起点(收集 k = 0 k=0 k=0 个雕塑时),就得先从起点走过去包含了 n + 1 n+1 n+1 的、期望的区间 [ i , j ] [i,j] [i,j] 的左或右端点了( i , j i,j i,j 分别在起点 n + 1 n+1 n+1 的左端右端,即 i ∈ [ 1 , n + 1 ] , j ∈ [ n + 1 , 2 n + 1 ] i\in[1,n+1],j\in[n+1,2n+1] i[1,n+1],j[n+1,2n+1]):
f i , j , 0 , 0 = L − a i f i , j , 0 , 1 = a j − L \begin{matrix} f_{i,j,0,0}=L-a_i\\ f_{i,j,0,1}=a_j-L \end{matrix} fi,j,0,0=Laifi,j,0,1=ajL

其实接下来和关路灯这道题大差不差了。不过这题多了分别考虑不取或者取雕塑。

不取的话直接从雕塑数为 k k k 的状态转移过来:
f i , j , k , 0 = min ⁡ { f i + 1 , j , k , 0 + ∣ x i + 1 − x i ∣ , f i + 1 , j , k , 1 + ∣ x j − x i ∣ } f i , j , k , 1 = min ⁡ { f i , j − 1 , k , 0 + ∣ x i − x j ∣ , f i , j − 1 , k , 1 + ∣ x j − 1 − x j ∣ } \begin{matrix} f_{i,j,k,0}=\min\{f_{i+1,j,k,0}+|x_{i+1}-x_i|,f_{i+1,j,k,1}+|x_j-x_i|\}\\ f_{i,j,k,1}=\min\{f_{i,j-1,k,0}+|x_i-x_j|,f_{i,j-1,k,1}+|x_{j-1}-x_j|\} \end{matrix} fi,j,k,0=min{fi+1,j,k,0+xi+1xi,fi+1,j,k,1+xjxi}fi,j,k,1=min{fi,j1,k,0+xixj,fi,j1,k,1+xj1xj}

取的话就从雕塑数为 k − 1 k-1 k1 的状态转移过来,不过要注意小于要求的时间节点:

  • f i , j , k , 0 = min ⁡ { f i + 1 , j , k − 1 , 0 + ∣ x i + 1 − x i ∣ , f i + 1 , j , k − 1 , 1 + ∣ x j − x i ∣ } f_{i,j,k,0}=\min\{f_{i+1,j,k-1,0}+|x_{i+1}-x_i|,f_{i+1,j,k-1,1}+|x_j-x_i|\} fi,j,k,0=min{fi+1,j,k1,0+xi+1xi,fi+1,j,k1,1+xjxi}
    可以转移当且仅当 min ⁡ { } \min\{\} min{} 内的项不大于 t i t_i ti,即取在 i i i 上的雕塑;
  • f i , j , k , 1 = min ⁡ { f i , j − 1 , k − 1 , 0 + ∣ x i − x j ∣ , f i , j − 1 , k − 1 , 1 + ∣ x j − 1 − x j ∣ } f_{i,j,k,1}=\min\{f_{i,j-1,k-1,0}+|x_i-x_j|,f_{i,j-1,k-1,1}+|x_{j-1}-x_j|\} fi,j,k,1=min{fi,j1,k1,0+xixj,fi,j1,k1,1+xj1xj}
    可以转移当且仅当 min ⁡ { } \min\{\} min{} 内的项不大于 t j t_j tj,即取在 j j j 上的雕塑。

然后统计答案,找到 k k k 最大的合法状态即可。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=402,inf=0x3f3f3f3f;
ll n,L,x[N],t[N];
ll f[N][N][N][2];
int main()
{
	scanf("%lld%lld",&n,&L);
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&x[i]);
		x[i+n+1]=x[i]+L;
	}
	x[0]=0,x[n+1]=L;
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&t[i]);
		t[i+n+1]=t[i];
	}
	memset(f,inf,sizeof(f));
	//起点是n+1 
	for(int j=n+1;j<=n+1+n;j++)//右 
	{
		for(int i=n+1;j<=i+n;i--)//左 
		{
			f[i][j][0][0]=L-x[i];//起点 向左 
			f[i][j][0][1]=x[j]-L;//起点 向右 
		}
	}
	for(int len=2;len<=n+1;len++)//成环 
	{
		for(int i=1;i<=n+1;i++)//左端点 
		{
			ll j=i+len-1;
			for(int k=1;k<len;k++)
			{
				f[i][j][k][0]=min(f[i][j][k][0],min(f[i+1][j][k][0]+abs(x[i+1]-x[i]),
												f[i+1][j][k][1]+abs(x[j]-x[i])));
				f[i][j][k][1]=min(f[i][j][k][1],min(f[i][j-1][k][0]+abs(x[i]-x[j]),
												f[i][j-1][k][1]+abs(x[j-1]-x[j])));
				if(f[i+1][j][k-1][0]+abs(x[i+1]-x[i])<=t[i])//取i,i+1->i 
				f[i][j][k][0]=min(f[i][j][k][0],f[i+1][j][k-1][0]+abs(x[i+1]-x[i]));
				if(f[i+1][j][k-1][1]+abs(x[j]-x[i])<=t[i])//取i,j->i 
				f[i][j][k][0]=min(f[i][j][k][0],f[i+1][j][k-1][1]+abs(x[j]-x[i]));
				if(f[i][j-1][k-1][0]+abs(x[i]-x[j])<=t[j])//取j,i->j
				f[i][j][k][1]=min(f[i][j][k][1],f[i][j-1][k-1][0]+abs(x[i]-x[j]));
				if(f[i][j-1][k-1][1]+abs(x[j-1]-x[j])<=t[j])//取j,j-1->j
				f[i][j][k][1]=min(f[i][j][k][1],f[i][j-1][k-1][1]+abs(x[j-1]-x[j])); 
			}
		}
	}
	ll ans=0;
	for(int len=2;len<=n+1;len++)
	{
		for(int i=1;i<=n+1;i++)
		{
			ll j=i+len-1;
			for(ll k=len;k>=1;k--)
			{
				if(ans>=k)break;
				if(f[i][j][k][0]<inf||f[i][j][k][1]<inf)
				{
					ans=max(ans,k);
					break;
				}
			}
		}
	}
	printf("%lld",ans);
	return 0;
}

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

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

相关文章

vue3+canvas裁剪框样式【前端】

目录 canvas绘制裁剪框&#xff1a;拖拽改变框的大小&#xff1a;圆圈样式&#xff1a;方块样式&#xff1a; canvas绘制裁剪框&#xff1a; // 绘制裁剪框 const drawCropRect (ctx: CanvasRenderingContext2D): void > {if (cropRect.value.width > 0 && crop…

软件功能测试和非功能测试有什么区别和联系?

软件测试是保障软件质量的核心环节&#xff0c;而软件功能测试和非功能测试作为测试领域的两大重要组成部分&#xff0c;承担着不同但又相互关联的职责。 软件功能测试指的是通过验证软件系统的各项功能是否按照需求规格说明书来正确实现&#xff0c;确保软件的功能和业务流程…

10_C++入门案例习题: 结构体案例

案例描述 学校正在做毕设项目&#xff0c;每名老师带领5个学生&#xff0c;总共有3名老师&#xff0c;需求如下 设计学生和老师的结构体&#xff0c;其中在老师的结构体中&#xff0c;有老师姓名和一个存放5名学生的数组作为成员 学生的成员有姓名、考试分数&#xff0c; 创建…

快速定位达梦缓存的执行计划并清理

开发告诉你一个sql慢&#xff0c;你想看看缓存中执行计划时&#xff0c;怎么精准快速定位&#xff1f; 可能一般人通过文本内容模糊搜索 select cache_item, substr(sqlstr,1,60)stmt from v$cachepln where sqlstr like %YOUR SQL STRING%; 搜出来的内容比较多&#xff0c;研…

若依、vben-admin、三维可视化

对三维可视化&#xff0c;包括cesium、模型加载、GIS有关的项目和技术都可以私信&#xff0c;包括基础数据后台管理系统的搭建和配置

LLMs可在2位精度下保持高准确率

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

爆改 toxml 组件 支持数据双向绑定 解决数据刷新问题

GGGGGGGGGGGGGGGGGithub地址自行研究 sbfkcel/towxml: 微信小程序HTML、Markdown渲染库https://github.com/sbfkcel/towxml原组件是以导入数据渲染信息为目的、本文以AI数据返回小程序为模拟效果演示 默认情况只在ready 环节进行渲染静态资源 1、对传入数据容器的位置做处理 …

Unreal如何使用后处理材质实现一个黑屏渐变效果

文章目录 前言相机后期处理材质创建材质相机设置动态修改FadeAlpha参数使用示例最后前言 UE5 开发VR ,如何通过PostProcess轻松实现黑屏渐变效果 最简单的办法,其实是使用一个半球形模型,遮挡住相机,然后控制这个半球形遮罩的颜色透明度,至少Unity中默认的Tunneling是这么…

DB-GPT支持mcp协议配置说明

简介 在 DB-GPT 中使用 MCP&#xff08;Model Context Protocol&#xff09;协议&#xff0c;主要通过配置 MCP 服务器和智能体协作实现外部工具集成与数据交互。 开启mcp服务&#xff0c;这里以网页抓取为例 npx -y supergateway --stdio "uvx mcp-server-fetch" …

CoT-Drive:利用 LLM 和思维链提示实现自动驾驶的高效运动预测

25年3月来自澳门大学和 MIT 的论文“CoT-Drive: Efficient Motion Forecasting for Autonomous Driving with LLMs and Chain-of-Thought Prompting”。 准确的运动预测对于安全的自动驾驶 (AD) 至关重要。本研究提出 CoT-Drive&#xff0c;这是一种利用大语言模型 (LLM) 和思…

Flowable7.x学习笔记(十)分页查询已部署 BPMN XML 流程

前言 上一篇文章我们已经完成了流程的部署功能&#xff0c;那么下一步就是要激活流程了&#xff0c;但是我们要需要明确的指定具体要激活部署后的哪一条流程&#xff0c;所以我们先把已部署的基础信息以及具体定义信息分页查询出来&#xff0c;本文先把基础代码生成以及完成分页…

Office文档图片批量提取工具

Office.Files.Images 是一款专注于从 Word、Excel、PPT 等 Office 文档中批量提取图片的轻量级工具&#xff0c;支持 .docx、.xlsx、.pptx 格式文件。该软件体积仅 ‌343KB‌&#xff0c;无需安装即可运行&#xff0c;通过拖拽操作实现快速解析与导出&#xff0c;尤其适合需批量…

33-公交车司机管理系统

技术&#xff1a; 基于 B/S 架构 SpringBootMySQLvueelementui 环境&#xff1a; Idea mysql maven jdk1.8 node 用户端功能 1.首页:展示车辆信息及车辆位置和线路信息 2.模块:车辆信息及车辆位置和线路信息 3.公告、论坛 4.在线留言 5.个人中心:修改个人信息 司机端功能…

PyCharm 初级教程:从安装到第一个 Python 项目

作为 Python 程序员&#xff0c;无论是刚入门还是工作多年&#xff0c;PyCharm 都是一个绕不开的开发工具。它是 JetBrains 出品的一款强大的 Python IDE&#xff0c;有自动补全、调试、虚拟环境支持、代码检查等等功能&#xff0c;体验比命令行 记事本舒服一百倍。 今天这篇…

QML FontDialog:使用FontDialog实现字体选择功能

目录 引言相关阅读FontDialog基本介绍字体属性 实例演示项目结构代码实现Main.qmlmain.cpp 代码解析运行效果 总结 引言 在桌面应用程序开发中&#xff0c;字体选择是一个常见的需求。Qt Quick提供了FontDialog组件来实现这一功能。本文将介绍如何在Qt Quick应用程序中使用Fon…

力扣刷题Day 27:环形链表(141)

1.题目描述 2.思路 创建一个结点集合&#xff0c;遍历链表&#xff0c;如果遇到已经加进集合的结点就说明链表有环。 3.代码&#xff08;Python3&#xff09; class Solution:def hasCycle(self, head: Optional[ListNode]) -> bool:node headnode_set set()while node…

研发效率破局之道阅读总结(3)工程优化

研发效率破局之道阅读总结(3)工程优化 Author: Once Day Date: 2025年4月22日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: 程序的艺术_Once-Day…

metasploit(2)生成dll木马

声明&#xff01;本文章所有的工具分享仅仅只是供大家学习交流为主&#xff0c;切勿用于非法用途&#xff0c;如有任何触犯法律的行为&#xff0c;均与本人及团队无关&#xff01;&#xff01;&#xff01; 一、dll文件基本概念 DLL 是一种包含可由多个程序同时使用的代码和数…

数据结构--并查集-高效处理连通性问题

目录 一、理论基础 &#xff08;1&#xff09;并查集的功能及实现原理 &#xff08;2&#xff09;代码模版 &#xff08;3&#xff09;模拟过程 &#xff08;4&#xff09;应用 二、基础题练习 &#xff08;1&#xff09;寻找存在的路径&#xff08;模版题&#xff09; …

WPS Office安卓版云文档同步速度与PDF转换体验测评

WPS Office安卓版是很多人常用的移动办公软件。它支持在线编辑、文档同步、格式转换等功能&#xff0c;适合手机和平板用户随时处理文档。我们用它配合谷歌浏览器打开网页文档时&#xff0c;也可以将内容快速保存到云端或转换成PDF格式使用。 先说云文档同步。在打开WPS Office…