Codeforces TypeDB Forces 2023 C. Remove the Bracket【上下界DP】

C. Remove the Bracket

F

题意

给定一个长度为 n n n 的整数数组 a a a 和一个非负整数 s s s

  • 要求 ∀ i ∈ [ 2 , n − 1 ] , 选定两个整数 x i , y i ,满足 x i + y i = s 且 ( x i − s ) ( y i − s ) ≥ 0 \forall i \in [2,n - 1],选定两个整数 x_i, y_i,满足 x_i + y_i = s 且 (x_i - s)(y_i - s) \geq 0 i[2,n1],选定两个整数xi,yi,满足xi+yi=s(xis)(yis)0

定义花费 F = a 1 ⋅ x 1 + y 1 ⋅ x 2 + y 2 ⋅ x 3 + y 3 ⋅ x 4 + . . . + y n − 2 ⋅ x n − 1 + y n − 1 ⋅ a n F = a_1 \cdot x_1 + y_1 \cdot x_2 + y_2 \cdot x_3 + y_3 \cdot x_4 + ... + y_{n - 2} \cdot x_{n - 1} + y_{n -1 } \cdot a_n F=a1x1+y1x2+y2x3+y3x4+...+yn2xn1+yn1an

求出满足限制的最小花费

思路

( x i − s ) ( y i − s ) ≥ 0 (x_i - s)(y_i - s) \geq 0 (xis)(yis)0 意味着: m i n ( x i , y i ) ≥ s min(x_i, y_i) \geq s min(xi,yi)s m a x ( x i , y i ) ≤ s max(x_i, y_i) \leq s max(xi,yi)s,而 x i + y i = s x_i + y_i = s xi+yi=s
所以 x i x_i xi 的取值是一段连续的区间

如果我们记录位置 i i i 分裂出来的 y i y_i yi 对应的最小值,可能有 n × s n \times s n×s 种状态,考虑优化

我们注意到:对于当前的 i i i,如果我们分裂成了 x i x_i xi y i y_i yi,那么它们会影响的位置只有:
y i − 1 ⋅ x i + y i ⋅ x i + 1 y_{i - 1} \cdot x_i + y_i \cdot x_{i + 1} yi1xi+yixi+1,我们假设 y i − 1 < x i + 1 y_{i -1} < x_{i + 1} yi1<xi+1,当 x i x_i xi 1 1 1时, y i y_i yi 对应减 1 1 1,此时 F F F 的变化量为: δ = y i − 1 − x i + 1 < 0 \delta = y_{i - 1} - x_{i + 1} < 0 δ=yi1xi+1<0,总体 F F F 是在减小的!所以这种情况下我们要尽可能为 x i x_i xi 取到最大值
另外一种情况则 x i x_i xi 尽可能取到最小值 x i − 1 = y i + 1 x_{i -1} = y_{i + 1} xi1=yi+1 时, x i x_i xi 取最大最小都无所谓

那么我们可以得出结论:每次 a i a_i ai 分裂都会往两种最值之一分裂,这就是典型的上下界 D P DP DP 求解最值问题

我们只需要在当前位置 i i i 记录两种取法的最小值即可, d p [ i ] [ 0 ] dp[i][0] dp[i][0] 表示这个位置取的是 x i x_i xi y i y_i yi 留到后面; d p [ i ] [ 1 ] dp[i][1] dp[i][1] 则相反

时间复杂度: O ( 4 n ) O(4n) O(4n)

#include<bits/stdc++.h>
#define fore(i,l,r)	for(int i=(int)(l);i<(int)(r);++i)
#define fi first
#define se second
#define endl '\n'
#define ull unsigned long long
#define ALL(v) v.begin(), v.end()
#define Debug(x, ed) std::cerr << #x << " = " << x << ed;const int INF=0x3f3f3f3f;
const long long INFLL=1e18;typedef long long ll;int main(){std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);int t;std::cin >> t;while(t--){int n, s;std::cin >> n >> s;std::vector<ll> a(n + 1), x(n + 1), y(n + 1);std::vector<std::array<ll, 2>> dp(n + 1);fore(i, 1, n + 1){std::cin >> a[i];if(i == 1 || i == n) x[i] = y[i] = a[i];else if(s >= a[i]) x[i] = 0, y[i] = a[i];else x[i] = s, y[i] = a[i] - s; //这里x 和 y 没有固定大小关系,但一定是上下界}dp[1][0] = dp[1][1] = 0;fore(i, 2, n + 1){dp[i][0] = std::min(dp[i - 1][0] + y[i - 1] * x[i], dp[i - 1][1] + x[i - 1] * x[i]);dp[i][1] = std::min(dp[i - 1][0] + y[i - 1] * y[i], dp[i - 1][1] + x[i - 1] * y[i]);}std::cout << dp[n][0] << endl;}return 0;
}

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

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

相关文章

恶意勒索Word文档模版注入分析

文章目录 前言1、工具&#xff1a;2、IOC样本&#xff1a;3、样本提取4、恶意文档分析参考手册 恶意的文档执行流程一、使用 OLEDUMP 和 OLEVBA 分析Word 文档1、OlEDUMP2、OLEVBA 二、使用 Detect-It Easy 识别文件类型-简单三、使用 7-zip 探索 OOXML 文档并查找模板注入四、…

程序员为什么要一直写 bug ?

程序员并不是故意写bug的&#xff0c;bug的产生通常是由多种因素导致的&#xff0c;例如&#xff1a; 需求理解不足&#xff1a;如果程序员没有完全理解项目的需求或者功能要求&#xff0c;可能会在编程过程中遗漏一些重要的细节&#xff0c;导致bug的产生。编程经验不足&…

Three.js真实相机模拟

有没有想过如何在 3D Web 应用程序中模拟物理相机&#xff1f; 在这篇博文中&#xff0c;我将向你展示如何使用 Three.js和 OpenCV 来完成此操作。 我们将从模拟针孔相机模型开始&#xff0c;然后添加真实的镜头畸变。 具体来说&#xff0c;我们将仔细研究 OpenCV 的两个失真模…

是谁?写的Java神作一出版就获Jolt图书大奖【抽奖赠书】

送书活动 1️⃣参与方式&#xff1a;点此参与抽书抽奖 2️⃣获奖方式&#xff1a;小程序随机 抽5位&#xff0c;每位小伙伴一本《Effective Java中文2024版》 3️⃣活动时间&#xff1a;截止到 2024-4-6 12:01:00 注&#xff1a;所有抽奖活动都是全国范围免费包邮到家&#xff…

openldap(一):简介和安装

目录 1 OpenLDAP简介1.1 LDAP介绍1、什么LDAP2、为什么要使用LDAP3、LDAP 的特点4、LDAP常用关键字5、LDAP的objectClass6、LADP使用场景 1.2 OpenLDAP介绍1、什么OpenLDAP2、OpenLDAP特点3、OpenLDAP的组件 2 OpenLDAP安装3 简单使用3.1 创建用户1、创建ou2、创建Group 3、创建…

Oracle基础-PL/SQL编程 备份

1、PL/SQL简介 PL/SQL块结构 约定&#xff1a;为了方便&#xff0c;本文后面把PL/SQL简称PL。 PL程序都是以块&#xff08;BLOCK&#xff09;为基本单位&#xff0c;整个PL块分三部分&#xff1a;声明部分&#xff08;使用DECLARE开头&#xff09;、执行部分(以BEGIN开头)和异…

springboot之RESTful接口与Swagger

一、RESTful GET获取资源、POST新建资源、PUT更新资源、DELETE删除资源。 RESTful两大特性 1、安全性&#xff1a;GET请求不会引起资源本身改变。 2、幂等性&#xff1a;对一个接口请求和多次请求返回的资源应该一致。 2xx&#xff1a;成功 4xx&#xff1a;客户端错误。 …

windows 设置共享文件夹

1、选择您要共享的文件夹&#xff0c;并右键点击该文件夹。在弹出的菜单中&#xff0c;选择“属性”选项。属性窗口中&#xff0c;选择“共享”选项卡 2、在共享选项卡中&#xff0c;点击“高级共享”按钮&#xff0c;勾选“共享此文件夹”选项。可以根据需要设置共享文件夹的…

全数字化病理,“根深”才能“叶茂”

现代医学之父William Osler曾言&#xff1a;病理学乃医学之本。 作为研究人体疾病发生的原因、发病机制、病理变化以及疾病过程中机体的形态结构、功能代谢变化和病变转归的一门基础医学科学&#xff0c;病理学一直被视为基础医学与临床医学之间的“桥梁学科”&#xff0c;在医…

数码论坛系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)电子科技数码爱好者交流信息新闻畅聊讨论评价

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读300套最新项目持续更新中..... 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含ja…

【turtle海龟先生】神奇的“圆”,画,太极圈,铜钱古币

turtle画圆三步法 步骤: 1、导入turtle库 2、确定半径&#xff0c;画圆(circle ) 3、结束(done ) turtle 库中提供一个直接画圆的函数 turtle.circle&#xff08;半径&#xff09;#半径单位为像素 例&#xff1a; turtle.circle ( 100 ) 表示绘制一个半径为100像素长度的圆形 …

用于自动驾驶,无人驾驶领域的IMU六轴陀螺仪传感器:M-G370

用于自动驾驶,无人驾驶的IMU惯导模块六轴陀螺仪传感器:M-G370。自2020年&#xff0c;自动驾驶,无人驾驶已经迎来新突破&#xff0c;自动驾驶汽车作为道路交通体系的一员&#xff0c;要能做到的就是先判断周边是否有障碍物&#xff0c;自身的行驶是否会对其他交通参与成员产生危…