【区间dp、前缀和】 P1220 关路灯 题解

news2024/12/23 0:18:17

关路灯

题目描述

某一村庄在一条路线上安装了 n n n 盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少)。老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯。

为了给村里节省电费,老张记录下了每盏路灯的位置和功率,他每次关灯时也都是尽快地去关,但是老张不知道怎样去关灯才能够最节省电。他每天都是在天亮时首先关掉自己所处位置的路灯,然后可以向左也可以向右去关灯。开始他以为先算一下左边路灯的总功率再算一下右边路灯的总功率,然后选择先关掉功率大的一边,再回过头来关掉另一边的路灯,而事实并非如此,因为在关的过程中适当地调头有可能会更省一些。

现在已知老张走的速度为 1 m / s 1m/s 1m/s,每个路灯的位置(是一个整数,即距路线起点的距离,单位: m m m)、功率( W W W),老张关灯所用的时间很短而可以忽略不计。

请你为老张编一程序来安排关灯的顺序,使从老张开始关灯时刻算起所有灯消耗电最少(灯关掉后便不再消耗电了)。

思路

推荐阅读【前置】- ButterflyDew的题解

记一共有 n n n 个路灯,老张开始在第 c c c 个路灯处, d i d_i di 表示第 i i i 个路灯每次的消耗, m i m_i mi 表示第 i i i 个路灯所处的地方, d p l , r , 0 , d p l , r , 1 dp_{l,r,0},dp_{l,r,1} dpl,r,0,dpl,r,1 表示关闭第 l l l 个到第 r r r 个路灯,最后停留在 l , r l,r l,r 的耗电量。

显而易见,如果 l ≤ r < c l \leq r<c lr<c c < l ≤ r c < l \leq r c<lr ,则无解。不妨令上诉情况的 d p l , r , 0 = d p l , r , 1 = 1 0 18 dp_{l,r,0}=dp_{l,r,1} = 10^{18} dpl,r,0=dpl,r,1=1018,避免对后续取值造成影响。

考虑 d p l , r dp_{l,r} dpl,r 转移,以 d p l , r , 0 dp_{l,r,0} dpl,r,0 为例。理论上来讲, d p l , r , 0 dp_{l,r,0} dpl,r,0 可以由 d p l + 1 , r , 0 , d p l + 1 , r , 1 , d p l , r − 1 , 0 , d p l , r − 1 , 1 dp_{l+1,r,0},dp_{l+1,r,1},dp_{l,r-1,0},dp_{l,r-1,1} dpl+1,r,0,dpl+1,r,1,dpl,r1,0,dpl,r1,1 四种情况推导而来,但观察到后两种情况实际上是先要从 r − 1 r-1 r1 再到 r r r 最后再到 l l l,则实际上可以改变为如下情况:
d p l + 1 , r , 0 , d p l + 1 , r , 1 , d p l , r , 1 dp_{l+1,r,0},dp_{l+1,r,1},dp_{l,r,1} dpl+1,r,0,dpl+1,r,1,dpl,r,1

d p l + 1 , r , 0 dp_{l+1,r,0} dpl+1,r,0 为例,
d p l , r , 0 = min ⁡ ( d p l , r , 0 , d p [ l + 1 , r , 0 + d i s ( l , l + 1 ) × ( ∑ i = 1 l d i + ∑ i = r + 1 n d i ) ) dp_{l,r,0} = \min(dp_{l,r,0,dp_[l+1,r,0} + dis(l,l+1) \times (\sum_{i=1}^{l}{d_i} + \sum_{i=r+1}^{n}{d_i})) dpl,r,0=min(dpl,r,0,dp[l+1,r,0+dis(l,l+1)×(i=1ldi+i=r+1ndi)),其中 d i s ( i , j ) dis(i,j) dis(i,j) 表示从 i i i j j j 距离:

int dis(int l,int r) { return abs(m[l] - m[r]);}

∑ i = 1 l d i + ∑ i = r + 1 n d i \sum_{i=1}^{l}{d_i} + \sum_{i=r+1}^{n}{d_i} i=1ldi+i=r+1ndi 部分考虑前缀和 解决,这里记为 w a s t e ( i , j ) waste(i,j) waste(i,j)

int waste(int l,int r) {return d[l] + d[n] - d[r - 1];}

最后别忘记 d p l , r , 0 = min ⁡ ( d p l , r , 0 , d p l , r , 1 + d i s ( l , r ) × w a s t e ( l − 1 , r + 1 ) dp_{l,r,0} = \min(dp_{l,r,0},dp_{l,r,1} +dis(l,r) \times waste(l-1,r+1) dpl,r,0=min(dpl,r,0,dpl,r,1+dis(l,r)×waste(l1,r+1),但其实没多少用。
在这里插入图片描述

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,c;
int d[55],m[55];
int dp[55][55][2];
int dis(int l,int r) { return abs(m[l] - m[r]);}
int waste(int l,int r) {return d[l] + d[n] - d[r - 1];}
signed main() {
	scanf("%lld %lld",&n,&c);
	for(int i = 1;i <= n;i++) scanf("%lld %lld",&m[i],&d[i]),d[i] += d[i - 1];
	for(int i = 1;i < c;i++) {
		for(int j = 1;j < c;j++) dp[i][j][0] = dp[i][j][1] = 1e18;
	}
	for(int i = c + 1;i <= n;i++) {
		for(int j = c + 1;j <= n;j++) dp[i][j][0] = dp[i][j][1] = 1e18;
	}
	for(int i = 2;i <= n;i++) {
		for(int l = c;l >= 1 and l + i - 1 >= c;l--) {
			int r = l + i - 1;
			dp[l][r][0] = dp[l][r][1] = 1e18;
			dp[l][r][0] = min(dp[l][r][0],dp[l + 1][r][0] + dis(l,l + 1) * waste(l,r + 1));
			dp[l][r][0] = min(dp[l][r][0],dp[l + 1][r][1] + dis(l,r) * waste(l,r + 1));
			dp[l][r][1] = min(dp[l][r][1],dp[l][r - 1][0] + dis(l,r) * waste(l - 1,r));
			dp[l][r][1] = min(dp[l][r][1],dp[l][r - 1][1] + dis(r - 1,r) * waste(l - 1,r));
			dp[l][r][0] = min(dp[l][r][0],dp[l][r][1] + dis(l,r) * waste(l - 1,r + 1));
			dp[l][r][1] = min(dp[l][r][1],dp[l][r][0] + dis(l,r) * waste(l - 1,r + 1));
		}
	}
	printf("%lld\n",min(dp[1][n][0],dp[1][n][1]));
    return 0;
}

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

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

相关文章

APACHE NIFI—wait、notify组件报拒绝连接访问的报错

报错文字&#xff1a; Wait[idele44704-6fb6-1b60-ffff-ffffdcofbba2]Failed to process session due to Failed to get signal for c84c4aec-1287-4216-b1a2-f5c6fod4a3b7 due to java.net.ConnectException:Connection refused: org.apache.nifi.processor.exception.Proces…

jmeter响应断言、json断言、断言持续时间操作

一、响应断言 Apply to&#xff1a;断言应用的范围&#xff0c;这里默认&#xff0c;通常发出一个请求只触发一个服务器测试字段 响应文本&#xff0c;response响应体内的信息响应代码&#xff1a; 响应码&#xff0c;一般是200响应信息&#xff1a;响应码后面的返回的信息&am…

zdppy+vue3+onlyoffice文档管理系统实战 20240831上课笔记 继续完善登录功能

遗留的问题 1、整合验证码的接口2、渲染验证码3、实现验证码校验的功能4、验证码校验通过之后&#xff0c;再校验登录功能 验证码框架怎么使用 安装&#xff1a; pip install zdppy_captcha使用示例&#xff1a; import zdppy_api as api import zdppy_captcha import zdp…

Docker compose 安装 ELK

1. 简介 方案概述 我们使用 Filebeat 作为日志收集器&#xff0c;接入到 Redis 队列&#xff0c;然后消费队列中的日志数据流转到 Logstash 中进行解析处理&#xff0c;最后输出到 Elasticsearch 中&#xff0c;再由 Kibana 展示到页面上。我们采用 Elasticsearch 3 节点集群…

hello树先生——AVL树

AVL树 一.什么是AVL树二.AVL树的结构1.AVL树的节点结构2.插入函数3.旋转调整 三.平衡测试 一.什么是AVL树 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0c;效率低下。…

【计组 | Cache原理】讲透Cache的所有概念与题型方法

Cache 写在前面&#xff1a;高速缓存Cache一直408中的重点以及绝对的难点&#xff0c;前几天我在复习计组第三章的知识&#xff0c;Cache这一节把我困住了&#xff0c;我发现很多概念我都不记得了&#xff0c;一些综合性强的计算题根本无从下手&#xff0c;我深知Cache对于每个…

1分钟把高质量AI知识库站点嵌入小程序

许多企业都有把 AI 知识库装进小程序、网站、企业微信、钉钉等的需求&#xff0c;让用户能够在小程序上访问到高品质的内容。奈何有太多限制&#xff0c;往往会遇到IP地址不被信任或技术对接接口配置等困难。HelpLook能帮你节省这些繁琐的程序&#xff0c;0代码快速将AI知识库站…

工程师们都爱看的Docker容器技术,一看就会!保姆级教程(上)

文章目录 Docker简介Docker在企业中的应用场景Docker与虚拟化的对比Docker的优势 部署Docker部署DockerDocker的基本操作Docker镜像管理容器的常用操作 Docker镜像构建Docker镜像结构镜像运行的基本原理镜像获得方式镜像构建Docker镜像构建企业实例 镜像优化方案镜像优化策略镜…

一款免费强大的快速启动工具,快速打开程序,软件,网站,工具等

Lucy是一款由个人开发者针对个人需求开发的快速启动工具&#xff0c;其最大的特点在于简洁和快速。它允许用户通过简单的拖拽操作将文件、文件夹、网址等添加到启动列表中&#xff0c;实现快速访问常用程序和文件的目的。Lucy不依赖于网络连接&#xff0c;避免了隐私泄露的风险…

Xcode插件开发

Xcode插件开发 文章目录 Xcode插件开发一、插件开发流程创建插件Extension文件介绍文件说明 二、插件使用安装说明 一、插件开发流程 创建插件的过程并不复杂&#xff0c;只是官方教程&#xff0c;过于简单&#xff0c;所以这里补充下创建细节 创建插件 环境&#xff1a;Xco…

公安智慧大楼信息化整体建设设计方案

1. 项目背景与需求分析 《公安智慧大楼信息化整体建设设计方案》针对一个用地面积和建筑面积均具规模的建设项目&#xff0c;提出了信息化建设的全方位设计方案&#xff0c;以满足现代公安业务的需求。 2. 信息化设计理念 方案强调了信息化设计的顶层设计方法论&#xff0c;…

【Qt】窗口概述

Qt 窗口概述 Qt窗口是由QMianWindow类来实现的。 QMainWindow 是⼀个为⽤⼾提供主窗⼝程序的类&#xff0c;继承⾃ QWidget 类&#xff0c;并且提供了⼀个预定义的布局。QMainWindow 包含 ⼀个菜单栏&#xff08;menu bar&#xff09;、多个⼯具栏(tool bars)、多个浮动窗⼝&a…

基于Swagger自动生成离线API文档(Word、Markdown文档)

在做项目时通常需要给客户提供离线Word的API文档归档&#xff0c;不要跟客户说有Swagger在线API文档&#xff0c;客户不会用也不会去看。只要你有Swagger&#xff0c;TableGo就能自动生成一份漂亮的Word离线API文档给客户&#xff0c;大大提高了写文档的效率&#xff0c;客户看…

【0-1背包】3180. 执行操作可获得的最大总奖励 I

给你一个整数数组 rewardValues&#xff0c;长度为 n&#xff0c;代表奖励的值。 最初&#xff0c;你的总奖励 x 为 0&#xff0c;所有下标都是 未标记 的。你可以执行以下操作 任意次 &#xff1a; 从区间 [0, n - 1] 中选择一个 未标记 的下标 i。 如果 rewardValues[i] 大…

openwrt结合智能家居(相关搜索:路由器)

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

如何在华为平板上开发一个web网页

首先进入华为应用市场下载Qpython 下载完成后打开,在主页里面进入pip,然后下载flask 下载完成后创建一个Python文件,输入 然后运行,进入了Qpython终端后输入pyth,然后就可以开始开发web网页了。 请各位老手们多多指点

10:USB模块布局

1.先处理差分线 先开上方飞线&#xff1a; 发现有个晶体&#xff1a; ①晶体有随身电容&#xff0c;随身电阻 ②晶体布局思路&#xff1a; –电容和电阻放在ic和晶体之间 –整个晶体的部分靠近IC – 信号走向&#xff1a;IC—>电阻—>电容(左右两边摆)—>晶体 开右…

基于Pytorch框架的深度学习HRnet网络人像语义分割系统源码

第一步&#xff1a;准备数据 头发分割数据&#xff0c;总共有5711张图片&#xff0c;里面的像素值为0和1&#xff0c;所以看起来全部是黑的&#xff0c;不影响使用 第二步&#xff1a;搭建模型 计算机视觉领域有很多任务是位置敏感的&#xff0c;比如目标检测、语义分割、实例…

做影像组学+深度学习技术研究如何发表高分论文,案例解析

论文简介 标题&#xff1a;Longitudinal MRI-based fusion novel model predicts pathological complete response in breast cancer treated with neoadjuvant chemotherapy: a multicenter, retrospective study&#xff08;纵向MRI结合新模型预测新辅助化疗乳腺癌的病理完全…

[C++进阶]map和set的相关题目

1. 下面关于map和set说法错误的是&#xff08;&#xff09; A.map中存储的是键值对&#xff0c;set中只储存了key B.map和set查询的时间复杂度都是O(log_2N) C.map和set都重载了[]运算符 D.map和set底层都是使用红黑树实现的 解析: A&#xff1a;正确&#xff0c;map和set的概念…