题目描述

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

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

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

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

输入输出格式

输入格式:

文件第一行是两个数字n(1<=n<=50,表示路灯的总数)和c(1<=c<=n老张所处位置的路灯号);

接下来n行,每行两个数据,表示第1盏到第n盏路灯的位置和功率。数据保证路灯位置单调递增。

输出格式:

一个数据,即最少的功耗(单位:J,1J=1W·s)。

输入输出样例

输入样例#1:

5 3
2 10
3 20
5 20
6 30
8 10

输出样例#1

270  

说明

输出解释:

{此时关灯顺序为3 4 2 1 5,不必输出这个关灯顺序}


思路

一道区间dp的好题。

思考这样一个问题:老张朝某个方向走以后,他的状态有什么改变?是他把某段区间的灯全部关掉。在任何时候,所关的灯都是一段连续的区间。

令状态dp[i][j]为区间[i,j]的灯目前关闭时的最小消耗电功。这里的最小消耗电功是指从开始到现在的所有灯的消耗数。

但是我们还要知道老张在哪,所以还得再加一维。令dp[i][j][k]为老张在第k个位子上时,区间[i,j]的当目前关闭时的最小消耗电功。但是此时的复杂度达到了O(n^3),数组开销也较大。

注意在最优解里面,如果目前位置在i,那么就可以走到i-1,也可以花j-i+1的时间走到j+1。老张在区间[i,j]里,要么在i,要么在j,这是显然的。所以第3维有2种状态。令dp[i][j][k]代表区间i,j的灯目前关闭时老张在i处(k==0)或j处(k==1)的时间点最小消耗电功。则有:

dp[i][j][0]=min(dp[i+1][j][0]+elecwork(), dp[i+1][j][1]+elecwork());

dp[i][j][1]=min(dp[i][j-1][0]+elecwork(), dp[i][j-1][1]+elecwork());

其中elecwork()计算从上一个区间转移过来时没关的路灯消耗的电。

要计算某阶段消耗的电力,则需要知道这一段的路程(即时间)和没有关的电灯的功率之和。电功之和可以用前缀和计算,复杂度为O(1)。

#include <stdio.h>
#include <iostream>
#include <memory.h>
using namespace std;
int dp[51][51][2],n,c,s,sum[51];
typedef struct
{int position,ew;
}lxydl;
lxydl a[51];
inline int elecwork(int i,int j,int l,int r)
{return (a[j].position-a[i].position)*(sum[l]+sum[n]-sum[r-1]);
}
signed main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);register int i,j,k,l;memset(dp,9999999,sizeof(dp));cin>>n>>c;for(i=1;i<=n;i++){cin>>a[i].position>>a[i].ew;sum[i]=sum[i-1]+a[i].ew;}dp[c][c][0]=dp[c][c][1]=0;//在初始位置上灯是关的 for(l=2;l<=n;l++){for(i=1;i+l-1<=n;i++){j=i+l-1;dp[i][j][0]=min(dp[i+1][j][0]+elecwork(i,i+1,i,j+1)/*是继续走下去?*/,dp[i+1][j][1]+elecwork(i,j,i,j+1)/*还是折返到j点?*/);dp[i][j][1]=min(dp[i][j-1][0]+elecwork(i,j,i-1,j),dp[i][j-1][1]+elecwork(j-1,j,i-1,j));}}cout<<min(dp[1][n][0],dp[1][n][1])<<endl;return 0;
}

[洛谷]P1220 关路灯 (#区间dp)相关推荐

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

    P1220 关路灯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 有一排路灯,老张有一个初始位置,他要把所有路灯都关掉.每个路灯都有各自的功率和坐标,问你关掉所有路灯所消耗 ...

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

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

  3. 洛谷 P1220 关路灯 [动态规划做法]

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

  4. 洛谷 P1220 关路灯(DFS)

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

  5. 洛谷 P1063 能量项链 区间dp

    洛谷 P1063 题意:在一串项链中,是环状的,第 i 颗珠子有两个能量a[i]和a[i+1],第i+1颗珠子有两个能量a[i+1]和a[i+2],可以合并两个珠子,得到a[i]*a[i+1]*a[i ...

  6. 四川2008省选·洛谷·奖励关

    初见安~这里是传送门:洛谷P2473 题目描述 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出 ...

  7. 洛谷1594 护卫队_区间dp_题解

    护卫队 出自洛谷题库 https://www.luogu.com.cn/problem/P1594 [问题描述] 不是具体题目 大概就是有n个车要过河,只有一个桥(理论上只能单向通行,其实不用管对面) ...

  8. 洛谷 P1440 求m区间内的最小值

    题目描述 一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值.若前面的数不足m项则从第1个数开始,若前面没有数则输出0. 输入输出格式 输入格式: 第一行两个 ...

  9. 【Java题解】洛谷题目P3205合唱队-区间动态规划解法

    题目描述: [HNOI2010]合唱队 - 洛谷https://www.luogu.com.cn/problem/P3205 题目信息提取: 这个题目要求我们按照某种顺序将这个队伍中的所有人按照从左到 ...

最新文章

  1. java强制转换成float_在Java中什么时候double必须强制转换成float 就是要在数值后加f或者强制转换...
  2. 字符串的最大最小表示法 模板
  3. Ubuntu 16.04使用root 帐号开启 SSH 登录
  4. DataTables中设置checkbox回显选中
  5. 用多媒体库 Bass.dll 播放 mp3 [15] - 设置与获取播放速度
  6. datapump跨平台升级迁移的总结
  7. 重量级!Maven史上最全教程,看了必懂
  8. 拓端tecdat|R语言结构方程模型SEM分析心理学和营销研究数据路径图可视化
  9. 500 内部服务器错误php,如何解决php 500内部服务器错误问题
  10. Pandas:时间序列数据基本操作和分组
  11. linux下安装java
  12. 基于声波的手势识别技术
  13. 国外RSGIS权威期刊杂志
  14. Antd如何用Menu组件渲染二级或三级目录
  15. 计算机镜像功能是什么,屏幕镜像是什么?它和投屏有什么关系?
  16. 我所理解的闭包是酱紫的
  17. centos添加硬盘
  18. 如虎添翼 7 个转场技巧
  19. 微信朋友圈得内容可以爬取吗?看完这篇你心里就有底了
  20. 什么是智能卡与IC卡

热门文章

  1. 【阿里云】第一次进行域名注册、备案以及使用全过程
  2. Java POI导出Excel时,合并单元格没有边框的问题
  3. 苹果台式计算机参数,苹果电脑参数在哪里看_怎么查看苹果电脑系统配置参数-win7之家...
  4. 简单的Windows游戏-第1部分:游戏框架
  5. linux cp -r 参数,Linux系统中cp命令的参数及用法详解
  6. z301摄像头的驱动移植
  7. 《数据访问 - 第01章 文件 - 文件和流的概念》
  8. [生存志] 第117节 九章算术均徭赋
  9. 深度学习理论(李宏毅
  10. 彻底搞懂MOS管的工作原理及应用