题目链接:https://www.luogu.com.cn/problem/P1220

本题涉及算法:区间DP。

我们一开始要做一些初始化操作,令:

  • \(p[i]\) 表示第i个路灯的位置;
  • \(w[i]\) 表示第i个路灯的功率;
  • \(sum[i]\) 表示前i个路灯的总功率

我们设状态 \(f[l][r][i]\) 表示:

  • 当 \(i=0\) 时,老张关了编号 \([l,r]\) 范围内的所有灯,并且此时老张在第 \(l\) 盏灯处(最左边)的最少消耗电量;
  • 当 \(i=1\) 时,老张关了编号\([l,r]\) 范围内的所有灯,并且此时老张在第 \(r\) 盏灯处(最右边)的最少消耗电量。

则我们可以得出状态转移方程如下:

\[f[l][r][0] = min(f[l+1][r][0] + (sum[l] + sum[n] - sum[r]) * (p[l+1] - p[l]), f[l+1][r][1] + (sum[l] + sum[n] - sum[r]) * (p[r] - p[l]))
\]

\[f[l][r][1] = min(f[l][r-1][0] + (sum[l-1] + sum[n] - sum[r-1]) * (p[r] - p[l]),f[l][r-1][1] + (sum[l-1] + sum[n] - sum[r-1]) * (p[r] - p[r-1]))
\]

实现代码如下:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 55;
  4. int n, c;
  5. long long p[maxn], // p[i]表示第i个路灯的位置
  6. w[maxn], // w[i]表示第i个路灯的功率
  7. sum[maxn], // sum[i]表示前i个路灯的总功率
  8. f[maxn][maxn][2]; // f[l][r][0]表示关了[l,r]范围内的灯并且当前在l位置的最小功率;
  9. // f[l][r][1]表示关了[l,r]范围内的灯并且当前在r位置的最小功率
  10. const long long INF = (1LL<<60);
  11. int main() {
  12. cin >> n >> c;
  13. for (int i = 1; i <= n; i ++) {
  14. cin >> p[i] >> w[i];
  15. sum[i] = sum[i-1] + w[i];
  16. }
  17. for (int i = 1; i <= n; i ++)
  18. for (int j = i; j <= n; j ++)
  19. f[i][j][0] = f[i][j][1] = INF;
  20. f[c][c][0] = f[c][c][1] = 0; // 一开始在第c盏路灯不消耗电量
  21. for (int len = 2; len <= n; len ++) {
  22. for (int l = max(1, c-len+1); l+len-1 <= n; l ++) {
  23. int r = l+len-1;
  24. f[l][r][0] = min(f[l+1][r][0] + (sum[l] + sum[n] - sum[r]) * (p[l+1] - p[l]),
  25. f[l+1][r][1] + (sum[l] + sum[n] - sum[r]) * (p[r] - p[l]));
  26. f[l][r][1] = min(f[l][r-1][0] + (sum[l-1] + sum[n] - sum[r-1]) * (p[r] - p[l]),
  27. f[l][r-1][1] + (sum[l-1] + sum[n] - sum[r-1]) * (p[r] - p[r-1]));
  28. }
  29. }
  30. cout << min(f[1][n][0], f[1][n][1]) << endl;
  31. return 0;
  32. }

洛谷P1220 关路灯 题解 区间DP的更多相关文章

  1. 洛谷P1220 关路灯【区间dp】

    题目:https://www.luogu.org/problemnew/show/P1220 题意:给定n盏灯的位置和功率,初始时站在第c盏处. 关灯不需要时间,走的速度是1单位/秒.问把所有的灯关掉 ...

  2. 洛谷P1220关路灯【区间dp】

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

  3. 洛谷P1220 关路灯(区间dp)

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

  4. 洛谷 P1220 关路灯(区间dp,前缀和)

    传送门 解题思路 先明确一下题意,c指的是路灯的编号而不是位置. 然后根据贪心,在从点i去关点j的路灯时,所有经过的路灯都会随手关掉(不耗时间),所以我们可以确定,若i点和j点的路灯已经关闭,那么区间 ...

  5. 洛谷 P1220 关路灯 题解

    Description 有 $n$ 盏路灯,每盏路灯有坐标(单位 $m$)和功率(单位 $J$).从第 $c$ 盏路灯开始,可以向左或向右关闭路灯.速度是 $1m/s$.求所有路灯的最少耗电.输入保证 ...

  6. 洛谷P1220关路灯题解

    题目 此题是一个状态转移方程还算比较多的一个区间DP,这个题也能启示我们如果某个状态不能够很好地解决问题,那么不妨试试再加一维,而且如果转移顺序不确定的话,可以试试记忆化搜索,说不定就可以比较容易的写 ...

  7. 洛谷P1220 关路灯

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

  8. 洛谷——P1220 关路灯

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

  9. 洛谷 P1220 关路灯 (贪心+区间dp)

    这一道题我一直在想时间该怎么算. 看题解发现有个隐藏的贪心. 路径一定是左右扩展的,左右端点最多加+1(我竟然没发现!!) 这个性质非常重要!! 因此这道题用区间dp f[i][j]表示关完i到j的路 ...

随机推荐

  1. HZOJ 礼物

    其实是比较简单的一道期望状压dp,考试时一直在想数组表示概率,然而最后出的数总是小于一,于是无奈的把第一个点判掉放弃了其他点. 设f[i]为状态为i时到全部买到的期望次数,$f[i]=∑f[j]*p[ ...

  2. Careers/Staffing Index

    Careers/Staffing Index     Not having data governance can hurt your business. Download this eBook to ...

  3. uniapp APP端使用指纹

    使用插件指纹模板: https://ext.dcloud.net.cn/plugin?id=358 Fingerprint模块管理指纹识别 要使用指纹识别功能需要具备条件: 确认当前设备环境是否支持指 ...

  4. Select multiple多选上移、下移

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD ...

  5. jq添加插入删除元素

    https://www.cnblogs.com/sandraryan/ append() - 在被选元素的结尾插入内容 <body> <div class="wrap&qu ...

  6. js利用select标签生成简易计算功能

    html中使用select option作为运算符的承接容器,输入值,选择不同运算符,计算结果. 文章地址 https://www.cnblogs.com/sandraryan/ <!DOCTY ...

  7. 记前端状态管理库Akita中的一个坑

    记状态管理库Akita中的一个坑 Akita是什么 Akita是一种基于RxJS的状态管理模式,它采用Flux中的多个数据存储和Redux中的不可变更新的思想,以及流数据的概念,来创建可观察的数据存储 ...

  8. 关于Spring JavaWeb工程中的ContextRefreshedEvent事件

    在应用启动时,通常想在此时预加载一些资源,全局使用. Spring会在操作应用上下文时,使用ApplicationEventPublisher触发相关ApplicationContextEvent,我 ...

  9. java 内存操作流

    操作内存流的时候(从读取出来,注意一定要把真正的数据用toByteArray或者toCharArray将数据读出来) 之前的文件操作流是以文件的输入输出为主的,当输出的位置变成了内存,那么就称为内存操 ...

  10. Vmware 虚拟化

    VMware Workstation软件需要依赖于宿主操作系统之上. VMware vSphere是VMware公司推出一套服务器虚拟化解决方案,它是可以直接独立安装和运行在祼机上的系统. VMwar ...