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;
}




目录
相关文章
|
12月前
|
机器学习/深度学习 自动驾驶 算法
深度学习在图像识别中的应用与发展
本文将深入探讨深度学习技术在图像识别领域的应用,通过案例分析展示其最新进展。我们将从基本原理出发,了解深度学习如何改变图像处理和识别的方式,并展望其未来可能的发展方向。
|
9月前
|
网络协议 数据建模 数据安全/隐私保护
网安快速入门之Windows命令
本文简要介绍了Windows命令行中常用的11个命令,帮助快速入门网络安全和系统管理。这些命令包括:`help`(获取命令帮助)、`copy`(复制文件)、`dir`(显示目录内容)、`cd`(更改当前目录)、`type`(显示文本文件内容)、`del`(删除文件)、`ipconfig`(查看网络配置)、`net`(用户和组管理)、`netstat`(显示网络连接)、`tasklist`(显示进程信息)和`sc`(服务控制)。每个命令都有其特定用途,掌握它们可以大大提高工作效率和系统维护能力。
|
9月前
|
人工智能 开发框架 自然语言处理
《鸿蒙NEXT:为人工智能开发者打造的“梦想舞台”》
鸿蒙NEXT为AI开发者提供全方位支持,包括强大的AI辅助编程工具DevEco CodeGenie、详尽的开发文档与教程、高效的开发平台DevEco Studio、盘古大模型的深度赋能、开放的生态合作机会及激励政策。这些资源助力开发者高效开发智能应用,推动AI技术在鸿蒙生态系统中的广泛应用与发展。
330 13
|
10月前
|
存储 数据采集 监控
阿里云DTS踩坑经验分享系列|SLS同步至ClickHouse集群
作为强大的日志服务引擎,SLS 积累了用户海量的数据。为了实现数据的自由流通,DTS 开发了以 SLS 为源的数据同步插件。目前,该插件已经支持将数据从 SLS 同步到 ClickHouse。通过这条高效的同步链路,客户不仅能够利用 SLS 卓越的数据采集和处理能力,还能够充分发挥 ClickHouse 在数据分析和查询性能方面的优势,帮助企业显著提高数据查询速度,同时有效降低存储成本,从而在数据驱动决策和资源优化配置上取得更大成效。
358 9
|
存储 机器学习/深度学习 编解码
阿里云服务器计算型c7、计算型c8a、计算型c8i、计算型c8y实例区别及选择参考
阿里云服务器计算型c7、计算型c8a、计算型c8i、计算型c8y是目前计算型实例规格中的热门实例规格,他们都同属于计算型实例,但是计算型c7属于第七代云服务器,而计算型c8a、计算型c8i、计算型c8y属于第八代云服务器,是最新一代的云服务器实例。本文将为大家展示这些实例规格之间的区别,以供参考和选择。
阿里云服务器计算型c7、计算型c8a、计算型c8i、计算型c8y实例区别及选择参考
|
12月前
|
机器学习/深度学习 人工智能 算法
【AI系统】AI 框架与编译器的作用
AI框架如PyTorch和TensorFlow提供丰富的API,简化神经网络模型的实现与训练,抽象硬件操作并自动管理内存。AI编译器将高级语言编写的模型转换为硬件可执行代码,通过多层次优化提升性能。这使得算法工程师可以专注于模型设计与创新,而无需关注底层计算细节。AI框架和编译器不仅提高开发效率,还能充分利用硬件资源,是推动AI系统性能提升的关键技术。访问昇腾社区官网或下载APP,获取更多AI学习资源和参与各类活动。
390 0
|
Cloud Native 关系型数据库 大数据
定川信息「川立方数治平台」通过PolarDB产品生态集成认证!
杭州定川信息技术有限公司「川立方数据治理一体化智能平台」通过PolarDB产品生态集成认证!
|
算法
《黑神话:悟空》中的环境渲染技术
【8月更文第26天】 随着游戏行业的不断发展,玩家对于游戏画面质量的要求也越来越高。《黑神话:悟空》作为一款备受期待的游戏大作,其精美的画质和细腻的环境渲染效果无疑给玩家带来了前所未有的视觉体验。本文将重点探讨《黑神话:悟空》中所采用的一些高级渲染技术及其背后的实现原理。
353 0
|
UED
AIGC滥用的三大后果
AIGC滥用的三大后果
340 8
AIGC滥用的三大后果