AtCoder ABC 328G 状态压缩 DP + 复杂度分析

题意

传送门 AtCoder ABC 328G Cut and Reorder

题解

假设答案对应的 a a a 下标 0 , 1 , ⋯ , n − 1 0,1,\cdots,n - 1 0,1,,n1 经过操作 1 变换为排列 p 0 , p 1 , ⋯ , p n − 1 p_{0},p_{1},\cdots,p_{n-1} p0,p1,,pn1,则对于满足 p i − 1 ≠ p i , 0 < i p_{i-1}\neq p_{i},0<i pi1=pi,0<i 的位置,都至少要分割一次,且仅需这样的分割就可以得到 a p 0 , a p 1 , ⋯ , a p n − 1 a_{p_{0}},a_{p_{1}},\cdots,a_{p_{n-1}} ap0,ap1,,apn1。则状态压缩优化 p p p 的枚举即可。

不考虑分割贡献,则需要维护两个变量:集合 A = { a p 0 , a p 1 , ⋯ , a p m } \mathcal{A}=\{a_{p_{0}}, a_{p_{1}}, \cdots,a_{p_{m}}\} A={ap0,ap1,,apm},以及集合匹配的 b b b 的前缀的长度 m m m。实际上,只需要维护前者,因为 ∣ A ∣ = m \lvert\mathcal{A}\rvert = m A=m

容易想到两类计算分割贡献的方案。一类是新增状态 a p i − 1 a_{p_{i-1}} api1,转移时可以直接判断 a p i − 1 ≠ a p i a_{p_{i-1}}\neq a_{p_{i}} api1=api,时间复杂度 O ( n 2 log ⁡ n ) O(n^2\log n) O(n2logn)。另一种方案是枚举分割的段,此时每一个连续的段(除了起始段)操作 1 贡献是 c c c A \mathcal{A} A 状态数为 2 n 2^n 2n,对于每一个状态,可能的段规模为 O ( n 2 ) O(n^2) O(n2),时间复杂度也是 O ( n 2 log ⁡ n ) O(n^2\log n) O(n2logn);实际上,这是一个宽松的界,对于每一个段的长度 k k k,实际上对应的状态数为 2 n − k 2^{n-k} 2nk,则一个更紧的界为 O ( ∑ k 2 n − k ) = O ( n log ⁡ n ) O(\sum k2^{n-k})=O(n\log n) O(k2nk)=O(nlogn)

#include <bits/stdc++.h>
using namespace std;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n;cin >> n;long long c;cin >> c;vector<long long> a(n), b(n);for (int i = 0; i < n; ++i) {cin >> a[i];}for (int i = 0; i < n; ++i) {cin >> b[i];}auto get_min = [&](long long &x, long long y) {x = min(x, y);};const long long inf = 1e18;vector<long long> dp(1 << n, inf);dp[0] = 0;for (int i = 0; i < 1 << n; ++i) {int bi = __builtin_popcount(i);for (int l = 0, r = 0; l < n; l = r) {if (i >> l & 1) {r = l + 1;continue;}while (r < n && (~i >> r & 1)) {r += 1;}for (int ai = l; ai < r; ++ai) {int st = 0;long long add = 0;for (int d = 1; ai + d <= r; ++d) {st |= 1 << (ai + d - 1);add += abs(a[ai + d - 1] - b[bi + d - 1]);long long split = bi == 0 ? 0 : c;get_min(dp[i | st], dp[i] + add + split);}}}}cout << dp[(1 << n) - 1] << '\n';return 0;
}

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

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

相关文章

C++ for循环:求任意整数的因数

#include <iostream>using namespace std;int main() {int i 0;int j 0;cout << "请输入任意整数&#xff1a;" << endl;cin >> j;cout << j << "的因数有&#xff1a;";for (i 1; i < j; i)if(j%i 0)cout <…

iTop-4412 裸机程序(二十二)- RTC时钟

目录 0.源码1. RTC2. iTop4412 中的 RTC使用的相关寄存器3. BCD编码4. 关键源码 0.源码 GitHub&#xff1a;https://github.com/Kilento/4412NoOS 1. RTC RTC是实时时钟&#xff08;Real Time Clock&#xff09;的缩写&#xff0c;是一种用于计算机系统的硬件设备&#xff0…

Matplotlib自定义辅助函数 (一):让你的图表大放异彩!

Matplotlib美化秘诀&#xff1a;自定义辅助函数&#xff0c;让你的图表大放异彩&#xff01; 利用Matplotlib进行数据可视化示例 &#x1f335;文章目录&#x1f335; &#x1f333;一、创建自定义样式函数&#x1f333;&#x1f333;二、创建自定义颜色映射&#x1f333;&…

Momentum2

攻击机 192.168.223.128 目标机 192.168.223.147 主机发现 nmap -sP 192.168.223.0/24 端口扫描 nmap -sV -A -p- 192.168.223.147 开启了22 80 端口 看一下web界面 源码&#xff0c;robots.txt ,url都观察了一下好像没什么有用信息 扫一下目录 gobuster dir -u http:…

实现JNDI

实现JNDI 问题陈述 Smart Software Developer Ltd.想要开发一款Web应用程序,它使用servlt基于雇员ID显示雇员信息,雇员ID由用户通过HTML用户界面传递。雇员详细信息存储在Employee_Master表中。另外,Web应用程序应显示网站被访问的次数。 解决方案 要解决上述问题,需要执…

重返信仰之源:树莓派的奇妙历程

众所周知&#xff0c;树莓派在十岁生日的庆典上&#xff0c;已经蜕变为全球首屈一指的微型电脑品牌&#xff0c;为全球的数千万开发者提供了离奇的可能性。充满乐趣和惊喜的名字——“树莓派”&#xff0c;取自各种水果的名字&#xff0c;回顾我们可以找到苹果&#xff0c;杏子…

Electron实战之入门

一、Electron简介 1.1 Electron是什么 Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的技术框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许开发者使用 JavaScript 代码来创建允许在Windows、macOS和Linux等平台。 1.2 发展历程 2013 年的时候…

Linux中sigaction函数和SIGCHLD信号的使用

sigaction函数&#xff1a; 函数说明&#xff1a;注册一个信号处理函数 函数原型&#xff1a;int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 函数参数&#xff1a; signum:捕捉的信号act:传入参数&#xff0c;…

Verilog不支持浮点数以及错误事例

Verilog 是一种硬件描述语言&#xff08;HDL&#xff09;&#xff0c;用于描述和设计数字电路和系统。它的主要目的是描述硬件行为和结构&#xff0c;因此不直接支持浮点数。Verilog 主要用于设计数字逻辑电路、处理器和其他数字系统&#xff0c;它的数据类型主要是位向量和整数…

C++ 特殊类的实现

一、请设计一个类&#xff0c;不能被拷贝 拷贝只会放生在两个场景中&#xff1a;拷贝构造函数以及赋值运算符重载&#xff0c;因此想要让一个类禁止拷贝&#xff0c;只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。 在C98中&#xff1a;将拷贝构造函数与赋值运算符重载…

【嵌入式移植】6、U-Boot源码分析3—make

U-Boot源码分析3—make all 从【嵌入式移植】4、U-Boot源码分析1—Makefile文章中可知执行make命令的时候&#xff0c;没有指定目标则使用默认目标PHONY&#xff0c;PHONY依赖项为_all all scripts_basic outputmakefile scripts dtbs。 all Makefile中第129行指定默认目标PH…

十大免费 Word 转 PDF 转换器工具榜单

将 Word 转换为 PDF 格式可以帮助您在不同操作系统之间轻松共享文件。无论您是发送重要备忘录、为客户开具发票、以一致的格式维护客户记录等等&#xff0c;PDF 都属于最流行且安全的文件格式。当您将 Word 文档转换为 PDF 格式时&#xff0c;您的项目会自动优化且更加紧凑。可…

腾讯云4核8G服务器够用吗?能支持多少人?

腾讯云4核8G服务器支持多少人在线访问&#xff1f;支持25人同时访问。实际上程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#xff0c;假设公网带宽太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU内存也会造成计算…

【数据统计】A股分红率排行榜2023

截至2023年底的&#xff0c;过去一年有分红的&#xff0c;分红率&#xff08;股息率&#xff09;排行榜。这里的分红率是股息率&#xff0c;即每股现金分红金额/年底的股价。比如000517荣安地产&#xff0c;2023年的分红方案是每10股3.2元&#xff0c;该股在2023年12月29日的收…

ELAdmin 部署

后端部署 按需修改 application-prod.yml 例如验证码方式、登录状态到期时间等等。 修改完成后打好 Jar 包 执行完成后会生成最终可执行的 jar。JPA版本是 2.6&#xff0c;MyBatis 版本是 1.1。 启动命令 nohup java -jar eladmin-system-2.6.jar --spring.profiles.active…

JDBC教程+数据库连接池

JDBC 1.JDBC概述 ​ JDBC&#xff0c;全称Java数据库连接&#xff08;Java DataBase Connectivity&#xff09;&#xff0c;它是使用Java语言操作关系型数据库的一套API。 ​ JDBC本质是官方&#xff08;原SUN公司&#xff0c;现ORACLE&#xff09;定义的一套操作所有关系型数…

nodejs和npm和vite

Nodejs 简单的说 Node.js 就是运行在服务端的 JavaScript。 Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台。 Node.js 是一个事件驱动 I/O 服务端 JavaScript 环境 用途&#xff1a; Node.js 可以被看作是一个 JavaScript 运行时环境&#xff0c;专门用于在服务…

Python re.findall()和re.finditer()实现在字符串中查找所有匹配项的功能区别

re.findall() re.findall() 函数返回所有非重叠匹配的列表。它只包含匹配的子串&#xff0c;不包含任何关于匹配位置的信息。 import re text "Hello, world! This is a test." pattern r"\w" # 匹配一个或多个单词字符 matches re.findall(patt…

Flutter 网络请求之Dio库

Flutter 网络请求之Dio库 前言正文一、配置项目二、网络请求三、封装① 单例模式② 网络拦截器③ 返回值封装④ 封装请求 四、结合GetX使用五、源码 前言 最近再写Flutter系列文章&#xff0c;在了解过状态管理之后&#xff0c;我们再来学习一下网络请求。 正文 网络请求对于一…

starknet之 class_hash

文章目录 问题背景什么是Class Hash问题背景 部署合约报错:ReferenceError: Buffer is not defined 什么是Class Hash 官方: https://book.starknet.io/ch04-03-01-deploy-standard-account.html?highlight=class%20hash#finding-the-class-hash 要部署智能合约,您需要在…