1258 关路灯

 时间限制: 1
s
 空间限制:
128000 KB
 题目等级 :
大师 Master

查看运行结果

题目描述 Description

多瑞卡得到了一份有趣而高薪的工作。每天早晨他必须关掉他所在村庄的街灯。所有的街灯都被设置在一条直路的同一侧。

多瑞卡每晚到早晨5点钟都在晚会上,然后他开始关灯。开始时,他站在某一盏路灯的旁边。

每盏灯都有一个给定功率的电灯泡,因为多端卡有着自觉的节能意识,他希望在耗能总数最少的情况下将所有的灯关掉。

多端卡因为太累了,所以只能以1m/s的速度行走。关灯不需要花费额外的时间,因为当他通过时就能将灯关掉。

编写程序,计算在给定路灯设置,灯泡功率以及多端卡的起始位置的情况下关掉所有的灯需耗费的最小能量。

输入描述 Input
Description

输入文件的第一行包含一个整数N,2≤N≤1000,表示该村庄路灯的数量。

第二行包含一个整数V,1≤V≤N,表示多瑞卡开始关灯的路灯号码。

接下来的N行中,每行包含两个用空格隔开的整数D和W,用来描述每盏灯的参数,其中0≤D≤1000,0≤W≤1000。D表示该路灯与村庄开始处的距离(用米为单位来表示),W表示灯泡的功率,即在每秒种该灯泡所消耗的能量数。路灯是按顺序给定的。

输出描述 Output
Description

输出文件的第一行即唯一的一行应包含一个整数,即消耗能量之和的最小值。注意结果小超过1,000,000,000。

样例输入 Sample
Input

4

3

2 2

5 8

6 1

8 7

样例输出 Sample
Output

56

数据范围及提示 Data Size &
Hint

分类标签 Tags 点此展开

分析:

我们发现关掉的路灯一定是连续的    YY易得(=
=假装有证明)

然后就想到“
 dp[i][j]表示i~j都关掉需要的能源

接着转移  转移很蛋疼(或许是我太弱)

首先想到dp[i][j]从dp[i+1][j]或者dp[i][j-1]转移过来  这时发现问题了
 如果不加限制

理论上会出现(以样例为例) dp[4][4]这样不合法的状态  而起点在3

那么限制一下端点也很容易搞定

还是有问题= =  这题我写的递归  就会递归出
 在求解dp[2][4]时 从dp[3][4]转移过来

也就是说这一步是在4号灯关了的情况下从3走到2  这样对于解的值不好计算
 于是想到加一个半维

此时dp[i][j][0]表示最后一步落在i  dp[i][j][1]表示最后一步落在j

到这里转移基本上很明了了  还有个问题在于转移时对增加的能耗的处理

= =一开始我很傻  写了个函数用O(n)去算转移时每一秒要耗的能源值

其实这个东西用一个sum[i][j]表示i~j的和就很容易了(况且关了灯的区间又是连续的)

自己的代码:

代码:
#include< cstdio >
#include< iostream >
#include< cstdlib >
#include< cstring >
long long int f[1001][1001][2],sum[1001]={0};
long long int n,d,w,x[1001],v;
using namespace std;
void input()
{
scanf("%d%d",&n,&v);
for(int i=1;i<=n;++i)
{
scanf("%d%d",&d,&w);//d juli w gong lv
sum[i]=sum[i-1]+w;//sum表示前i个灯的功率和,好计算除了区间之外的其他点的消费 
x[i]=d;
}
}

int main()
{
input();
memset(f,0x3f3f3f3f,sizeof(f));//3维数组赋值最大,赋值0x4个3f,二维数组赋值0x7加7个f。 
f[v][v][0]=f[v][v][1]=0;//f[i][j][0]表示熄灭i-j区间的灯的花费且站在i点,f[i][j][1]表示站在j点 
for(int j=v;j<=n;++j)//j从v到最终 
 for(int
i=j-1;i>=1;--i)//i从j-1到1,第一次循环用到f[j][j][1||0],之后第一维的数一直减小,用之前更新过的来更新它(这是倒序的原因) 
 {
 
f[i][j][0]=min(f[i+1][j][0]+(sum[i]+sum[n]-sum[j])*abs(x[i]-x[i+1]),f[i+1][j][1]+(sum[i]+sum[n]-sum[j])*abs(x[i]-x[j]));
 
f[i][j][1]=min(f[i][j-1][1]+(sum[i-1]+sum[n]-sum[j-1])*abs(x[j-1]-x[j]),f[i][j-1][0]+(sum[i-1]+sum[n]-sum[j-1])*abs(x[i]-x[j]));
 }
printf("%d\n",min(f[1][n][0],f[1][n][1]));
return 0;
}

109.关路灯(区间dp)的更多相关文章

  1. P1220 关路灯 区间dp

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

  2. P1220 关路灯——区间dp

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

  3. 洛谷 P1220 关路灯 区间DP

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

  4. 洛谷P1220关路灯——区间DP

    题目:https://www.luogu.org/problemnew/show/P1220 区间DP. 代码如下: #include<iostream> #include<cstd ...

  5. luogu1220_关路灯 区间dp

    传送门 区间dp f[i][j][state] : [i, j]区间 state=0 当前选i state = 1 当前选j 注意枚举的顺序 转移的设计时 在同时刻不在[i,j]区间里的数也要考虑 不 ...

  6. 洛谷P1220关路灯[区间DP]

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

  7. 洛谷P1220关路灯[区间DP 提前计算代价]

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

  8. luogu 1220 关路灯 区间dp

    Code: #include <bits/stdc++.h> #define ll long long #define N 1003 #define setIO(s) freopen(s& ...

  9. [luoguP1220] 关路灯(DP)

    传送门 如果去关某一个灯,那么途中经过的灯都能关闭,那么就是连续一段区间,区间DP. f[i][j][0] 表示关完 i, j 这个区间且在 i 这个位置 f[i][j][1] 表示关完 i, j 这 ...

随机推荐

  1. border-1px;避免移动端下边框部分2px

    .border-1px { position: relative; } .border-1px:after { display: block; position: absolute; left:; b ...

  2. ubuntu12.04 Qt WebKit编译

    转载自:http://my.oschina.net/u/257674/blog/167050 官方文档: http://trac.webkit.org/wiki/BuildingQtOnLinux#D ...

  3. struts2学习笔记(三)

    一. Struts2 的验证 1). 验证分为两种: > 声明式验证* >> 对哪个 Action 或 Model 的那个字段进行验证 >> 使用什么验证规则 >& ...

  4. HDU2546饭卡---(DP 经典背包)

    http://acm.hdu.edu.cn/showproblem.php?pid=2546 饭卡 Time Limit: 5000/1000 MS (Java/Others)    Memory L ...

  5. POJ2154 Color

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10322   Accepted: 3360 Description Bead ...

  6. 【洛谷 P4289】[HAOI2008]移动玩具(搜索)

    其实这题可以不用状压.. 提供一种新思路. 我们在读入目标棋盘的时候,把当前位置的数和当前棋盘进行比较,如果不一样,如果当前是\(1\),目标是\(0\),那么我们就把当前位置加入\(needmove ...

  7. Django【进阶】中间件

    中间件   一.概念 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 其 ...

  8. python基础===python3中 http.client 和 urllib的那些事

    import http.client #python3中没有了 httplib的库 #python 3.x中urllib库和urilib2库合并成了urllib库.. #其中urllib2.urlop ...

  9. 原型和JS内置对象

    原型 1.定义 每一个对象都有原型 原型仍然是一个对象 模拟实现面向对象的继承性 2.原型链 对象的原型还有原型 对象除了可以使用自有属性还可以继承原型上的属性 3.获取原型 对象.__proto__ ...

  10. python数据类型-----字符串

    今天来总结下python3.4版本字符串的一些操作方法,对这些方法先作一个简单的分类,按照分类来进行总结. Sequence Typessequence类型有六种:strings, byte sequ ...