P1220 关路灯

简介: P1220 关路灯

文章目录

  • P1220 关路灯
  • AC代码


P1220 关路灯

本题链接:P1220 关路灯

本博客给出本题截图

1.png

AC代码

代码解释:

这个题整体来看还是比较好想的,下面我们一步一步去分析这个问题:

首先我们去想这个题可以怎么去做,这里有三种思路

①dfs + 玄学剪枝

②贪心

③动态规划

这里我们来说第三种做法 (第一种第二种还没想过怎么代码实践

首先,不管我们怎么去写这个dp,都有一个我们绕不开的东西:我们需要不断的去计算消耗电量这个问题,这个其实就是时间(路程)×功率,这个是是根据时间的消耗是不断累加的,然后又因为dp的本质其实是最优选法的暴力,所以对于每一个不同的状态,如果我们都要去不断的叠加这个耗电量的话,很可能会TLE,那么对于处理这样的有反复计算叠加的问题,显然我们可以用 前缀和 的思维去进行优化.

好了,说完这一点,我们来看这个dp的具体实现部分 (敲黑板!

这么一个区间的问题,最简单的考虑方式就是由一个二维数组f[i][j]去表示,这个数组所表达的含义为[i, j]这一段的路灯已经全部熄灭的耗电量的最少值,即只有[1 ~ i)和(j, n]上的灯是处于点亮的状态时,当前的耗电量最小值

我们在定义到现在,需不需要再补充点什么东西呢?显然是需要的,我们虽然按照如上的方式去定义了f[i][j],但是,我们却不知道我们所处在哪个位置,即我们虽然保证了[i, j]上的所有灯都是处于熄灭的状态,但是我们却不知道我们现在在哪个位置,因为位置是决定时间的,而时间是决定耗电量的关键,故我们还需要规定一下我们的位置,显然,我们只可能处在i这个点上或者j这个点上,故我们不妨去规定f[i][j][0]代表[i, j]之间所有的灯都处于熄灭的状态且我们站在i这个点,f[i][j][1]代表[i, j]之间所有的灯都处于熄灭的状态且我们站在j这个点

以上,就是我们的dp方程的定义,下面,也是最难的,如何去写这个状态转移方程:

有初始化:

memset(f, 0x3f, sizeof f);
f[c][c][0] = f[c][c][1] = 0;

显然对于每一个f[i][j],我们都要去分两个方面去思考状态转移方程:即分别去计算f[i][j][0]和f[i][j][1]的min,下面去介绍如何计算:

对于f[i][j][0]这个点,我们只可能从f[i + 1][j]转移而来,即f[i][j][0] = min(f[i + 1][j][0] + num1, f[i + 1][j][1] + num2);,其中num1和num2分别指从f[i + 1][j][0]和f[i + 1][j][1] 转移到f[i][j][0]的过程中,其余灯泡的耗电量

在本题解的最开头已经说明利用 前缀和 的思维去进行优化,这里来说具体时间,我们的p数组就是前缀和数组,d数组代表的是我们的距离数组,那么我们在从i + 1移动到i的这个过程中消耗的时间(即路程)分别为:d[i + 1] - d[i],d[j] - d[i],那么在这两个过程中哪些灯泡是正在处于点亮耗电状态呢:p[i] + p[n] - p[j],(对这一步有疑问的话可以去模拟一下例子),f[i][j][1]的转移方法和f[i][j][0]一致,这里不再过多赘述,读者可以自己写一下,和我的代码进行对比即可

那么剩下的就是迈向成功的最后一步:如何去写for循环

因为在c处的灯是瞬间熄灭的,所以熄灭灯的长度最少是从2开始的,且不能超过n,然后开始枚举左端点即可,利用l(长度)和i(左端点)可以计算出右端点,即:

for (int l = 2; l <= n; l ++ )
    for (int i = 1; i + l - 1 <= n; i ++ )
      int j = i + l - 1;

最后,因为我们不知道是在1处有最小值还是在n处有最小值,故直接对f[1][n][0]f[1][n][1]取最小值即可

代码

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 55;
int n, c;
int f[N][N][2];
int p[N], d[N];
int main()
{
  int n, c;
  cin >> n >> c;
  for (int i = 1; i <= n; i ++ )
  {
    int w;
    cin >> d[i] >> w;
    p[i] = p[i - 1] + w;
  }
  memset(f, 0x3f, sizeof f);
  f[c][c][0] = f[c][c][1] = 0;
  for (int l = 2; l <= n; l ++ )
    for (int i = 1; i + l - 1 <= n; i ++ )
    {
      int j = i + l - 1;
      f[i][j][0] = min(f[i + 1][j][0] + (d[i + 1] - d[i]) * (p[i] + p[n] - p[j]), f[i + 1][j][1] + (d[j] - d[i]) * (p[i] + p[n] - p[j]));
      f[i][j][1] = min(f[i][j - 1][0] + (d[j] - d[i]) * (p[i - 1] + p[n] - p[j - 1]), f[i][j - 1][1] + (d[j] - d[j - 1]) * (p[i - 1] + p[n] - p[j - 1]));
    }
  cout << min(f[1][n][0], f[1][n][1]) << endl;
  return 0;
}




目录
相关文章
|
6月前
|
边缘计算 安全 数据安全/隐私保护
智能接入网关
智能接入网关SAG(Smart Access Gateway)是阿里云提供的软件定义广域网SD-WAN(Software Defined Wide Area Network)解决方案。企业可通过智能接入网关实现一站式接入阿里云,获得更加智能、安全和可靠的上云体验。
99 4
|
13天前
|
内存技术
除了智能照明系统,PWM 还可以应用在哪些领域
脉冲宽度调制(PWM)技术不仅适用于智能照明系统,还广泛应用于电机控制、电源管理、音频处理和通信系统等领域,以实现高效能的信号和功率控制。
59 11
|
6月前
|
传感器 智能硬件
智能家电设备供电
智能家电设备供电
65 4
|
人工智能 编解码 安全
凯迪仕、德施曼、华为斗法,智能门锁勇闯安全关
大数据、物联网、人工智能、云计算等新一代信息技术的快速发展,广泛应用于各类家电家具,门锁的智能水平与日俱增。
120 0
BOSHIDA 三河博电科技 开关电源模块 遥控开/关电路
模块电源的遥控开关操作,是通过 REM 端进行的。一般控制方式有两种: (1)REM 与-VIN(参考地)相连,遥控关断,要求 VREF<0.4V。REM 悬空或与+VIN 相连,模块工作,要求 VREM>1V。 (2)REM 与 VIN 相连,遥控关断,要求 VREM<0.4V。REM 与+VIN 相连,模块工作,要求 VREM>1V。REM 悬空,遥控关断,即所谓“悬空关断”(-R)。 如果控制要与输入端隔离,则可以使用光电耦合器作为传递控制信号。
BOSHIDA 三河博电科技  开关电源模块 遥控开/关电路
|
传感器 监控 安全
基于单片机的家庭防盗报警系统的设计与实现_kaic
摘要:本论文研究的是将AT89C52单片机芯片作为核心元器件的防盗报警系统,该系统除了具有直接报警的功能外,还额外增加了布防和红外感应的功能。和市场上的其他各类防盗报警器相比,该设计的不同之处在于它所具有的布防功能和红外检测功能。在到达指定布防时间的时候,红外检测电路与之相配合来达到防盗的目的。此外,不论何时只要有人经过,红外检测电路的热释电红外传感器都会感应到相应的人体红外信号,并将其转化为电平信号传送给单片机,从而驱动显示灯亮。这种报警器相对比较隐蔽,能够很好的掩人耳目,不至于被盗贼发现实行破坏行为。另外,增加的布防功能可以让住户有足够的开门关门时间,减小了误报率。 整体的设计运用了模块化
|
数据采集 弹性计算 网络协议
智能接入网关介绍|学习笔记
快速学习智能接入网关介绍
智能接入网关介绍|学习笔记
开关电源模块 遥控开/关电路
模块电源的遥控开关操作,是通过 REM 端进行的。一般控制方式有两种: (1)REM 与-VIN(参考地)相连,遥控关断,要求 VREF<0.4V。REM 悬空或与+VIN 相连,模块工作,要求 VREM>1V。 (2)REM 与 VIN 相连,遥控关断,要求 VREM<0.4V。REM 与+VIN 相连,模块工作,要求 VREM>1V。REM 悬空,遥控关断,即所谓“悬空关断”(-R)。
开关电源模块 遥控开/关电路
【物联网智能网关-02】获取摄像头数据+显示
开发了一套扩展库,用户只要几行代码,就可以完成和传感器的通信,从而获取数据。YFSoft.Hardware.Camera.PTC01.dll就是一种这样的库。
754 0
|
传感器
【物联网智能网关-01】通过AD采集获取温湿度
AD方式的温湿度传感器和另两种有所不同,前两种一般温湿度已经处理好,通过协议解析就可以直接获取温湿度的数值。而AD方式采集的只是电压值,需要根据一定的公式进行数据计算,才能获取最终的温湿度值。
1164 0