1001: 节 能

时间限制: 1 Sec  内存限制: 128 MB

提交: 21  解决: 9

[提交][状态][讨论版]

题目描述

Dr.Kong设计的机器人卡多越来越聪明。最近市政公司交给卡多一项任务,每天早晨5:00开始,它负责关掉ZK大道右侧上所有的路灯。

卡多每到早晨5:00准会在ZK大道上某盏路灯的旁边,然后他开始关灯。每盏灯都有一定的功率,机器人卡多有着自觉的节能意识,它希望在关灯期间,ZK大道右侧上所有路灯的耗电量总数是最少的。

机器人卡多以1m/s的速度行走。假设关灯动作不需要花费额外的时间,因为当它通过某盏路灯时就顺手将灯关掉。

请你编写程序,计算在给定路灯设置,灯泡功率以及机器人卡多的起始位置的情况下,卡多关灯期间,ZK大道上所有灯耗费的最小能量。

输入

第一行:  N       表示ZK大道右侧路灯的数量         (2≤ N ≤ 1000)

第二行:  V       表示机器人卡多开始关灯的路灯号码。   (1≤V≤N)

接下来的N行中,每行包含两个用空格隔开的整数D和W,用来描述每盏灯的参数

D表示该路灯与ZK大道起点的距离  (用米为单位来表示),

W表示灯泡的功率,即每秒该灯泡所消耗的能量数。路灯是按顺序给定的。

( 0≤D≤1000, 0≤W≤1000 )

输出

输出一个整数,即消耗能量之和的最小值。注意结果小于200,000,000

样例输入

4 32 25 86 18 7

样例输出

56

思路:做的时候没有思路,知道是DP,但是推不出来。

这道题目用区间DP的做法。设置dp[i][j][0]为关掉从i到j的所有灯,并最终处于i所在的位置时消耗的最少能量;dp[i][j][1]就表示为关掉从i到j的所有灯,并最后处于j的位置时消耗的最少能量。对于一个状态转移,从相邻的位置中得到信息,同时要考虑转移时其他电灯增加的功率损耗。诸事中写的很详细了。

代码:

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int maxn=1005;
struct node {
int pos,val;//pos亮灯的位置,val此位置电灯单位时间内消耗的功率
node() {pos=val=0;}
}ans[maxn];
int dp[maxn][maxn][2];
int fw[maxn][maxn];
int main() {
int n,index,totalw=0;
scanf("%d",&n);scanf("%d",&index);
for(int i=1;i<=n;i++) {
scanf("%d%d",&ans[i].pos,&ans[i].val);totalw+=ans[i].val;//totalw表示初始状态电灯功率总耗损
}
memset(fw,0,sizeof(fw));
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++) {
for(int j=i;j<=n;j++) {
fw[i][j]=fw[i][j-1]+ans[j].val;//该数组表示从i位置到j位置初始状态下的功率总耗
}
}
//初始化进行分段考虑,从给定位置v向两边扩散
//v的左边
for(int i=index-1;i>=1;--i) {
//先考虑停留到左边,然后考虑回到右边
dp[i][index][0]=dp[i+1][index][0]+(totalw-fw[i+1][index])*(ans[i+1].pos-ans[i].pos);
dp[i][index][1]=dp[i][index][0]+(totalw-fw[i][index])*(ans[index].pos-ans[i].pos);
}
//v的左边
for(int j=index+1;j<=n;++j) {
//先考虑停留到右边,然后考虑回到左边
dp[index][j][1]=dp[index][j-1][1]+(totalw-fw[index][j-1])*(ans[j].pos-ans[j-1].pos);
dp[index][j][0]=dp[index][j][1]+(totalw-fw[index][j])*(ans[j].pos-ans[index].pos);
}
for(int i=index-1;i>=1;--i) {
for(int j=index+1;j<=n;++j) {
//对于dp[i][j][0]只能考虑dp[i+1][j][0|1]的状态,dp[i][j-1][0|1]没有意义。
dp[i][j][0]=min((dp[i+1][j][0]+(totalw-fw[i+1][j])*(ans[i+1].pos-ans[i].pos)),
(dp[i+1][j][1]+(totalw-fw[i+1][j])*(ans[j].pos-ans[i].pos)));
//道理同上
dp[i][j][1]=min((dp[i][j-1][1]+(totalw-fw[i][j-1])*(ans[j].pos-ans[j-1].pos)),
(dp[i][j-1][0]+(totalw-fw[i][j-1])*(ans[j].pos-ans[i].pos)));
}
}
//要么在左边,要么在右边,挑最小的即可
int result=min(dp[1][n][0],dp[1][n][1]);
printf("%d\n",result);
return 0;
}

第四届河南省ACM 节能 区间DP的更多相关文章

  1. 第四届河南省ACM SUBSTRING 字符串处理

    SUBSTRING 时间限制: 1 Sec  内存限制: 128 MB 提交: 17  解决: 5 [提交][状态][讨论版] 题目描述 You are given a string input. Y ...

  2. 第四届河南省ACM 序号互换 进制转换

    序号互换 时间限制: 1 Sec  内存限制: 128 MB 提交: 41  解决: 19 [提交][状态][讨论版] 题目描述 Dr.Kong设计了一个聪明的机器人卡多,卡多会对电子表格中的单元格坐 ...

  3. 第四届河南省ACM 表达式求值 栈

    表达式求值 时间限制: 1 Sec  内存限制: 128 MB 提交: 14  解决: 7 [提交][状态][讨论版] 题目描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简 ...

  4. 2016 ACM/ICPC Asia Regional Shenyang Online 1009/HDU 5900 区间dp

    QSC and Master Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  5. ACM学习历程—HDU1584 蜘蛛牌(动态规划 && 状态压缩 || 区间DP)

    Description 蜘蛛牌是windows xp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么这些牌也跟着一起 ...

  6. HDU5900 QSC and Master(区间DP + 最小费用最大流)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5900 Description Every school has some legends, ...

  7. 2016 年沈阳网络赛---QSC and Master(区间DP)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5900 Problem Description Every school has some legend ...

  8. HDU 4283---You Are the One(区间DP)

    题目链接 http://acm.split.hdu.edu.cn/showproblem.php?pid=4283 Problem Description The TV shows such as Y ...

  9. HDU 4293---Groups(区间DP)

    题目链接 http://acm.split.hdu.edu.cn/showproblem.php?pid=4293 Problem Description After the regional con ...

随机推荐

  1. 机器学习之决策树(ID3 、C4.5算法)

    声明:本篇博文是学习<机器学习实战>一书的方式路程,系原创,若转载请标明来源. 1 决策树的基础概念 决策树分为分类树和回归树两种,分类树对离散变量做决策树 ,回归树对连续变量做决策树.决 ...

  2. Vue源码后记-更多options参数(1)

    我是这样计划的,写完这个还写一篇数据变动时,VNode是如何更新的,顺便初探一下diff算法. 至于vue-router.vuex等插件源码,容我缓一波好吧,vue看的有点伤. 其实在之前讲其余内置指 ...

  3. 负载均衡集群企业级应用实战—LVS

    一.负载均衡集群介绍 1.集群 ① 集群(cluster)技术是一种较新的技术,通过集群技术,可以在付出较低成本的情况下获得在性能.可靠性.灵活性方面的相对较高的收益,其任务调度则是集群系统中的核心技 ...

  4. 浏览器怎么解析一个hmtl文档

    注意 link里面的css文件是并行请求下载的 script里面的js文件是同步请求下载的 html页面中的语句都是从上往下执行的 浏览器是同步加载 JavaScript 脚本,即渲染引擎遇到 def ...

  5. css 权重 特殊性

    选择器的特异性由 CSS2 规范定义如下:     !important的规则比其他的权值都大     p{color: red !important} 如果声明来自于“style”属性,而不是带有选 ...

  6. Samba服务安装及配置

    服务器环境:CentOS6.9 Linux 2.6.32-696.10.1.el6.x86_64 安装Samba服务 过程中会安装3个服务smb(文件.打印共享服务,使用139.445端口).nmb( ...

  7. JAVAscript学习笔记 jsBOM 第七节 (原创) 参考js使用表

    <html> <head> <title>day02_js</title> <script type="text/javascript& ...

  8. 腾讯Java程序员第二轮面试11个问题,你会几个?

    此前,分享了阿里巴巴.网易.百度等多家名企的JAVA面试题. 这也引来了不少程序员网友们的围观. 其中,也有相当一部分网友是已经从事Java开发好多年的程序员,当他们阅读完JAVA面试题的反应是:一个 ...

  9. axios在vue中的简单配置与使用

    一.axios 简介 axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,它本身具有以下特征:https://hzzly.github.io/2017/03/12/ ...

  10. 两个Xml转换为DataSet方法(C#)

    ///通过传入的特定XML字符串,通过 ReadXml函数读取到DataSet中.protected static DataSet GetDataSetByXml(string xmlData){   ...