当前位置: 首页 > article >正文

信息学奥赛一本通 1610:玩具装箱 | 洛谷 P3195 [HNOI2008] 玩具装箱

【题目链接】

ybt 1610:玩具装箱
洛谷 P3195 [HNOI2008] 玩具装箱

【题目考点】

1. 动态规划:斜率优化动规

斜率优化动规模板题:信息学奥赛一本通 1607:【 例 2】任务安排 2 | 洛谷 P10979 任务安排 2

【解题思路】

玩具长度 C C C序列是由n个整数构成的整数序列。每个容器中放入的玩具是 C C C序列的一个子段。
该问题抽象后为:给定整数序列 C C C,将该序列分为若干个子段,子段[l, r]的费用为 ( r − l + ∑ i = l r C i − L ) 2 (r-l+\sum_{i=l}^rC_i-L)^2 (rl+i=lrCiL)2。对于所有的子段划分方案,求所有子段费用加和最小的方案的费用加和。

1. 状态定义
  • 阶段:前i个元素
  • 决策:确定一个子段
  • 策略:子段划分方案
  • 策略集合:前i个元素的所有子段划分方案
  • 条件:费用加和最小
  • 统计量:费用加和

状态定义 d p i dp_i dpi:前i个元素的所有子段划分方案中,费用加和最小的方案的费用加和。
初始状态 d p 0 dp_0 dp0:前0个元素的费用加和为0。

2. 状态转移方程
  • 策略集合:前i个元素的所有子段划分方案
  • 分割策略集合:最后一个子段的起始位置划分策略集合

设序列 C C C的前缀和数组为 s u m C sumC sumC,则子段 [ l , r ] [l, r] [l,r]的费用为 ( r − l + ∑ i = l r C i − L ) 2 = ( r − l + s u m C r − s u m C l − 1 − L ) 2 (r-l+\sum_{i=l}^rC_i-L)^2 = (r-l+sumC_r-sumC_{l-1}-L)^2 (rl+i=lrCiL)2=(rl+sumCrsumCl1L)2
前i个元素进行子段划分,设最后一个子段为 [ j + 1 , i ] [j+1, i] [j+1,i]
显然j最小为0,整个序列就是最后一个子段。j最大为i-1,此时最后一个子段只有第i元素。j的范围为 0 ≤ j < i 0\le j < i 0j<i
前i个元素的费用加和,为前j个元素进行子段划分的最小费用加和 d p j dp_j dpj加上最后一个子段的费用 ( i − j − 1 + s u m C i − s u m C j − L ) 2 (i-j-1+sumC_i-sumC_j-L)^2 (ij1+sumCisumCjL)2。取所有费用加和的最小值
因此状态转移方程为: d p i = m i n { d p j + ( i − j − 1 + s u m C i − s u m C j − L ) 2 } , 0 ≤ j < i dp_i = min\{dp_j+(i-j-1+sumC_i-sumC_j-L)^2\}, 0\le j < i dpi=min{dpj+(ij1+sumCisumCjL)2},0j<i
S i = s u m C i + i = ∑ j = 1 i C j + i = ∑ j = 1 i ( C j + 1 ) S_i = sumC_i+i = \sum_{j=1}^iC_j+i=\sum_{j=1}^i(C_j+1) Si=sumCi+i=j=1iCj+i=j=1i(Cj+1),因此 S i S_i Si就是 C i + 1 C_i+1 Ci+1的前缀和。
使 L ′ = L + 1 L'=L+1 L=L+1,去掉状态转移方程中的min,方程写为:
d p i = d p j + ( S i − S j − L ′ ) 2 dp_i = dp_j+(S_i-S_j-L')^2 dpi=dpj+(SiSjL)2
将与j相关的量视为变量,整理为
d p i = d p j + ( S i − L ′ ) 2 + S j 2 − 2 ( S i − L ′ ) S j dp_i = dp_j+(S_i-L')^2+S_j^2-2(S_i-L')S_j dpi=dpj+(SiL)2+Sj22(SiL)Sj
d p j + S j 2 = 2 ( S i − L ′ ) S j + d p i − ( S i − L ′ ) 2 dp_j+S_j^2=2(S_i-L')S_j+dp_i-(S_i-L')^2 dpj+Sj2=2(SiL)Sj+dpi(SiL)2

y = d p j + S j 2 y = dp_j+S_j^2 y=dpj+Sj2 x = S j x=S_j x=Sj k = 2 ( S i − L ′ ) k=2(S_i-L') k=2(SiL) b = d p i − ( S i − L ′ ) 2 b = dp_i-(S_i-L')^2 b=dpi(SiL)2,上式可以写为 y = k x + b y=kx+b y=kx+b

其实这里整理成 d p j + S j 2 + 2 L ′ S j = 2 S i S j + d p i − ( S i − L ′ ) 2 dp_j+S_j^2+2L'S_j=2S_iS_j+dp_i-(S_i-L')^2 dpj+Sj2+2LSj=2SiSj+dpi(SiL)2也可以求解。
只要保证:y、x是只与j相关的表达式,k是与i相关的表达式,b中有 d p i dp_i dpi即可

对于 0 ≤ j < i 0\le j < i 0j<i的所有决策点 ( x , y ) (x, y) (x,y) ( S j , d p j + S j 2 ) (S_j, dp_j+S_j^2) (Sj,dpj+Sj2),看过哪一个决策点的斜率为 k k k的直线的截距 b b b是最小的,此时求出的就是 d p i dp_i dpi的最小值。
接下来进行斜率优化,本文只进行大体描述,具体细节见:
信息学奥赛一本通 1607:【 例 2】任务安排 2 | 洛谷 P10979 任务安排 2
设单调队列q维护所有的决策点集合中的下凸壳。q的队头为 q l q_l ql,队尾为 q r q_r qr
此时随着i的增大, k = 2 ( S i − L ′ ) k=2(S_i-L') k=2(SiL)是增大的,因此对于所有 q l q_l ql q l + 1 q_{l+1} ql+1的斜率 K ( q l , q l + 1 ) K(q_l, q_{l+1}) K(ql,ql+1)满足 K ( q l , q l + 1 ) ≤ 2 ( S i − L ′ ) K(q_l, q_{l+1})\le 2(S_i-L') K(ql,ql+1)2(SiL) q l q_l ql可以进行队头出队。
而后取当前的队头 q l q_l ql作为最优决策点,将 j = q l j=q_l j=ql带入 d p i = d p j + ( S i − S j − L ′ ) 2 dp_i = dp_j+(S_i-S_j-L')^2 dpi=dpj+(SiSjL)2,求出 d p i dp_i dpi,新的决策点为 ( S i , d p i + S i 2 ) (S_i, dp_i+S_i^2) (Si,dpi+Si2)
维护下凸壳,保证没有上凸点,只要 K ( q r , i ) ≤ K ( q r − 1 , q r ) K(q_r, i) \le K(q_{r-1}, q_r) K(qr,i)K(qr1,qr),那么队尾入队i。
最后输出 d p n dp_n dpn

【题解代码】

解法1:斜率优化

#include<bits/stdc++.h>
using namespace std;
typedef long long LL; 
#define N 50005
LL n, L, c[N], s[N], dp[N];//dp[i]::前i个元素的所有子段划分方案中,费用加和最小的方案的费用加和。 
int q[N], l = 1, r = 0;//单调队列
LL Y(int j)
{return dp[j]+s[j]*s[j];
}
LL X(int j)
{return s[j];
}
LL K(int i)
{return 2*(s[i]-L);
}
bool cmp(LL a1, LL b1, LL a2, LL b2)//a1/b1 <= a2/b2
{return a1*b2 <= a2*b1;
}
int main()
{cin >> n >> L;L++;//L'= L+1for(int i = 1; i <= n; ++i){cin >> c[i];s[i] = s[i-1]+c[i]+1;}q[++r] = 0;//dp[0] = 0,添加决策点(s[0], dp[0]+s[0]^2) for(int i = 1; i <= n; ++i){while(l < r && cmp(Y(q[l+1])-Y(q[l]), X(q[l+1])-X(q[l]), K(i), 1))l++;dp[i] = dp[q[l]]+(s[i]-s[q[l]]-L)*(s[i]-s[q[l]]-L);while(l < r && cmp(Y(i)-Y(q[r]), X(i)-X(q[r]), Y(q[r])-Y(q[r-1]), X(q[r])-X(q[r-1])))r--;q[++r] = i;		}cout << dp[n];return 0;
} 

相关文章:

信息学奥赛一本通 1610:玩具装箱 | 洛谷 P3195 [HNOI2008] 玩具装箱

【题目链接】 ybt 1610&#xff1a;玩具装箱 洛谷 P3195 [HNOI2008] 玩具装箱 【题目考点】 1. 动态规划&#xff1a;斜率优化动规 斜率优化动规模板题&#xff1a;信息学奥赛一本通 1607&#xff1a;【 例 2】任务安排 2 | 洛谷 P10979 任务安排 2 【解题思路】 玩具长度…...

数仓工具—Hive语法之不同纬度聚合

不同纬度聚合 提到不同纬度聚合,大家想到的肯定是grouping sets,或者是cube和rollup 其实这些我们之前都讲过,可以看看之前的文章 数仓工具—Hive语法之cube和rollup 数仓工具—Hive语法之grouping sets 但是我们今天遇到的问题是,使用的工具不支持grouping sets,既然…...

领码科技:在低代码技术浪潮中的分享与探索

前言&#xff1a; 25年的职业生涯&#xff0c;赋予了我深厚的技术积累与实践经验。从武汉大学的工测系毕业&#xff0c;到央企副总工的职位&#xff0c;我始终站在IT浪潮的最前沿。然而&#xff0c;离开企业后&#xff0c;我并未停止前行的脚步。从2024年11月起&#xff0c;我选…...

大数据学习(80)-数仓分层

&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一…...

刘强东突然发声:不该用算法压榨最底层兄弟!东哥,真正的人民企业家

今天忙了一天&#xff0c;很累&#xff0c;准备睡觉的时候&#xff0c;看到网上盛传的刘强东的朋友圈&#xff0c;东哥又在朋友圈发文了。 说实话&#xff0c;看完之后&#xff0c;感动&#xff0c;真的感动。 尤其是当我看到这两句话的时候。 1、我们所学的知识、商业模式、技…...

Java 记忆链表,LinkedList 的升级版

文章目录 记忆链表 MemoryLinkedList实战源代码 众所周知&#xff0c;ArrayList 和 LinkedList 是 Java 集合中两个基本的数据结构&#xff0c;对应数据结构理论中的数组和链表。但在这两个数据结构&#xff0c;开发者们通常使用 ArrayList&#xff0c;而不使用 LinkedList。JD…...

【构建CV图像识别系统】从传统方法到深度学习

目录 1. 图像的基本概念1.1 像素与色彩1.2 过滤与卷积 2. 图像分类与检测3. 图像特征的提取3.1 全局特征3.2 局部特征3.2.1 边缘&#xff08;Edge&#xff09;3.2.2 角点&#xff08;Corner&#xff09;3.2.3 SIFT 特征 4. 传统方法与深度学习在图像识别中的应用4.1 基于传统方…...

.net core集成MQTT服务端

程序作为MQTT的服务端&#xff0c;也是WebApi 接口地址&#xff0c;在Web页面中MQTTJS用的是Websocker协议&#xff0c;在Winfrom中用MQTT协议。导致程序需要启动两个端口。直接上代码 创建服务 引用包&#xff1a;MQTTnet&#xff0c;MQTTnet.AspNetCore&#xff0c;这包最新…...

poetry安装与使用

文章目录 安装方法创建虚拟环境其他常用命令从 poetry.lock 中安装第三方依赖包 安装方法 安装命令&#xff08;全局安装&#xff0c;不要在虚拟环境中安装&#xff0c;方便后面创建环境使用&#xff09; pip install poetry修改虚拟环境路径&#xff08;首次使用poetry时执行&…...

UVM config机制及uvm_resource_pool

目录 1. uvm_config_db 类源码 1.1 set 1.2 get 2. uvm_resource_pool 2.1 uvm_resource_pool::set 2.2 uvm_resource 3. usage 4. 小结 uvm提供一种uvm_config_db机制使得在仿真中通过变量设置来修改环境,使环境更加灵活。本文主要介绍uvm_config_db#(type)::get/set…...

JAVA学习*接口

接口 在生活中我们常听说USB接口&#xff0c;那接口是什么呢&#xff1f; 在Java中&#xff0c;接口相当于多个类的一种公共规范&#xff0c;是一种引用数据类型。 定义接口 public interface IUSB {public static final String SIZE "small";public abstract vo…...

Day11 动态规划入门

动态规划 就是 : 给定一个问题&#xff0c;我们把它拆成一个个子问题&#xff0c;直到子问题可以直接解决。然后把子问题的答案保存起来&#xff0c;以减少重复计算。再根据子问题答案反推&#xff0c;得出原问题解的一种方法. 记忆化搜索 暴力dfs 记录答案 动态规划入门思…...

WPF UI元素保存为图像文件

WPF UI元素保存为图像文件 实现功能示例代码使用示例关键代码说明WPF UI元素保存为图像文件 实现功能 将WPF界面元素(如控件、布局容器)的当前视觉内容保存为图像文件适用场景:截取控件的实时显示内容(如图表、界面快照);将动态生成的UI元素导出为图片用于分享、存档或打…...

指令型样本或偏好型样本有什么区别和联系

两者都是基于给定文本生成的训练样本&#xff0c;但侧重点和用途不同&#xff1a; 指令型样本&#xff08;Instruction-based samples&#xff09; 结构&#xff1a;通常是一个简单的指令和对应的回答&#xff0c;例如一对“问题&#xff0d;答案”或“指令&#xff0d;回答”。…...

neo4j-如何让外部设备访问wsl中的neo4j

WSL 运行在一个虚拟网络环境中&#xff0c;它的 IP 只能被宿主 Windows 访问&#xff0c;外部设备无法直接访问 WSL 的端口。你需要在 Windows 上转发端口&#xff0c;让外部设备可以访问 Windows 并映射到 WSL。 1. 获取 WSL 的 IP 地址 在 WSL 中运行以下命令获取其 IP 地址…...

Python实验:读写文本文件并添加行号

[实验目的] 熟练掌握内置函数open()的用法&#xff1b;熟练运用内置函数len()、max()、和enumerate()&#xff1b;熟练运用字符串的strip()、ljust()和其它方法&#xff1b;熟练运用列表推导式。 [实验和内容] 1.编写一个程序demo.py&#xff0c;要求运行该程序后&#xff0…...

IDEA导入jar包后提示无法解析jar包中的类,比如无法解析符号 ‘log4j‘

IDEA导入jar包后提示无法解析jar包中的类 问题描述解决方法 问题描述 IDEA导入jar包的Maven坐标后&#xff0c;使用jar中的类比如log4j&#xff0c;仍然提示比如无法解析符号 log4j。 解决方法 在添加了依赖和配置文件后&#xff0c;确保刷新你的IDE项目和任何缓存&#xff…...

抖音用户视频批量下载工具开发全解析

一、逆向工程原理剖析 1.1 抖音Web端防护体系 抖音采用五层防御机制保护数据接口: graph LRA[浏览器指纹检测] --> B[请求参数签名]B --> C[Cookie动态验证]C --> D[请求频率限制]D --> E[IP信誉评级] 1.2 核心参数解密 参数名称作用原理生成方式有效期x-bogu…...

数据结构——顺序栈seq_stack

前言&#xff1a;大家好&#x1f60d;&#xff0c;本文主要介绍了数据结构——顺序栈 目录 一、概念 1.1 顺序栈的基本概念 1.2 顺序栈的存储结构 二、基本操作 2.1 结构体定义 2.2 初始化 2.3 判空 2.4 判满 2.5 扩容 2.6 插入 入栈 2.7 删除 出栈 2.8 获取栈顶元…...

LangChain其它五类组件详解(1)—— 文档加载器(Document loaders)

LangChain其它五类组件详解(1)—— 文档加载器(Document loaders) 前言本篇摘要15. LangChain其它五类组件详解15.1 文档加载器(Document loaders)15.1.1 文档加载概述15.1.2 加载Markdown1. 基本用法2. 保留元素参考文献前言 本系列文章主要介绍WEB界面工具Gradio。Gra…...

JVM常见面试总结

JVM&#xff08;Java虚拟机&#xff09;是Java程序运行的核心&#xff0c;掌握JVM相关知识对于Java开发者至关重要。以下是JVM常见的面试问题总结&#xff1a; 1. JVM内存模型 问题&#xff1a;JVM的内存结构分为哪些部分&#xff1f; 答案&#xff1a; 方法区&#xff08;Met…...

美团Leaf分布式ID生成器使用教程:号段模式与Snowflake模式详解

引言 在分布式系统中&#xff0c;生成全局唯一ID是核心需求之一。美团开源的Leaf提供了两种分布式ID生成方案&#xff1a;号段模式&#xff08;高可用、依赖数据库&#xff09;和Snowflake模式&#xff08;高性能、去中心化&#xff09;。本文将手把手教你如何配置和使用这两种…...

python3.13.2安装详细步骤(附安装包)

文章目录 前言一、python3.13.2下载二、python3.13.2安装详细步骤1.查看安装文件2.启动安装程序3.安装模式选择4.自定义安装配置5.高级选项设置6.执行安装7.开始安装8.安装完成8.打开软件9.安装验证 前言 在数字化时代&#xff0c;Python 已成为不可或缺的编程语言。无论是开发…...

AI-Talk开发板之更换串口引脚

一、默认引脚 CSK6011A使用UART0作为Debug uart&#xff0c;AI-Talk开发板默认使用的GPIOA2和GPIOA3作为Debug uart的RX和TX&#xff0c;通过连接器CN6引出。 二 、更换到其它引脚 查看60xx_iomux_v1.0可以&#xff0c;UART0的tx和rx可以映射到很多管脚上。 结合AI-Talk开发板…...

深度解读DeepSeek:源码解读 DeepSeek-V3

深度解读DeepSeek&#xff1a;开源周&#xff08;Open Source Week&#xff09;技术解读 深度解读DeepSeek&#xff1a;源码解读 DeepSeek-V3 深度解读DeepSeek&#xff1a;技术原理 深度解读DeepSeek&#xff1a;发展历程 文章目录 整体流程模型初始化模型前向传播MoE https:/…...

JavaIO流的使用和修饰器模式(直击心灵版)

系列文章目录 JavaIO流的使用和修饰器模式 文章目录 系列文章目录前言一、字节流&#xff1a; 1.FileInputStream(读取文件)2.FileOutputStream(写入文件) 二、字符流&#xff1a; 1..基础字符流:2.处理流&#xff1a;3.对象处理流&#xff1a;4.转换流&#xff1a; 三、修饰器…...

爬虫入门re+bs4

目录 前言 1. 导入必要的库 2. 定义获取网页HTML内容的函数 get_html 3. 定义获取数据的函数 get_data 4. 定义获取文章正文内容的函数 content_text 5. 定义获取单条课程数据的函数 get_one_course_data 6. 定义保存数据的函数 save_data 7. 定义文件名合法化处理函数 sanitiz…...

【WebGL】texImage2D函数

参数 从像素数据加载纹理 gl.texImage2D(target, level, internalformat, width, height, border, format, type, source);从图像元素加载纹理 gl.texImage2D(target, level, internalformat, format, type, image);target gl.TEXTURE_2D&#xff08;2D 纹理&#xff09; T…...

北斗设备启动流程与时长解析

北斗卫星导航系统作为我国自主研发的全球卫星导航系统&#xff0c;广泛应用于交通、通信、农业等多个领域。今天&#xff0c;我们就来详细探讨一下北斗设备的启动流程以及不同启动方式下的时长。 一、北斗设备的启动流程 北斗设备的启动流程可以分为以下几个关键步骤&#xf…...

MySQL身份验证的auth_socket插件

在Ubuntu 20.04 LTS上&#xff0c;MySQL 8.0默认使用auth_socket插件进行身份验证&#xff0c;可能存在意想不到的情况。 一、auth_socket插件 在使用sudo mysql或通过sudo切换用户后执行任何MySQL命令时&#xff0c;不需要输入密码或错误密码都可以正常登入mysql数据库&…...