区间DP code[vs]1258 关路灯

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

贴代码

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 int n,v;
 7 int in;
 8 int d[1010],w[1010];
 9 int f[1010][1010],g[1010][1010];
10 //f[i][j] 关掉[i,j]的代价,现在处在i,从右向左而来
11 //g[i][j] 关掉[i,j]的代价,现在处在j,从左向右而来
12
13 int main(){
14     scanf("%d",&n);
15     scanf("%d",&v);
16     for(int i=1;i<=n;i++) scanf("%d%d",&d[i],&in),w[i]=w[i-1]+in;
17     memset(f,0x3f3f3f3f,sizeof(f));
18     memset(g,0x3f3f3f3f,sizeof(g));
19     f[v][v]=0;
20     g[v][v]=0;
21     for(int i=2;i<=n;i++)//已关的数目
22         for(int j=(v>=i?v-i+1:1);j<=v&&j<=n-i+1;j++){//左端点
23             int e=j+i-1;//右端点
24             f[j][e]=min(f[j+1][e]+(d[j+1]-d[j])*(w[n]+w[j]-w[e]),g[j+1][e]+(d[e]-d[j])*(w[n]+w[j]-w[e]));
25             g[j][e]=min(f[j][e-1]+(d[e]-d[j])*(w[n]+w[j-1]-w[e-1]),g[j][e-1]+(d[e]-d[e-1])*(w[n]+w[j-1]-w[e-1]));
26         }
27     printf("%d\n",min(f[1][n],g[1][n]));
28     return 0;
29 }
时间: 2024-10-19 23:49:25

区间DP code[vs]1258 关路灯的相关文章

codevs1258 关路灯(☆区间dp)

1258 关路灯 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 多瑞卡得到了一份有趣而高薪的工作.每天早晨他必须关掉他所在村庄的街灯.所有的街灯都被设置在一条直路的同一侧. 多瑞卡每晚到早晨5点钟都在晚会上,然后他开始关灯.开始时,他站在某一盏路灯的旁边. 每盏灯都有一个给定功率的电灯泡,因为多端卡有着自觉的节能意识,他希望在耗能总数最少的情况下将所有的灯关掉. 多端卡因为太累了,所以只能以1m/s的速度行走.关灯不需要花

【codevs2211】WJM2BMR安慰MM记 区间dp

事实上这道题的原型是1258——关路灯,为什么选了这个呢? 废话,因为题目呗= = 言规正传,觉得这道题扯到看不懂的可以去翻codevs1258,说的挺易懂的 其实就是一道区间dp,比较裸的代码,考虑清楚就好 记录过去和回来的最小安慰时间= = 贴代码 var n,c,i,j,sum:longint; m,w:array[0..1100] of longint; a,l,r:array[0..1005,0..1005] of longint; function min(a,b:longint):

P1220 关路灯 区间DP

题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了给村里节省电费,老张记录下了每盏路灯的位置和功率,他每次关灯时也都是尽快地去关,但是老张不知道怎样去关灯才能够最节省电.他每天都是在天亮时首先关掉自己所处位置的路灯,然后可以向左也可以向右去关灯.开始他以为先算一下左边路灯的总功率再算一下右边路灯的总功率,然后选择先关掉功率大的一边,再回过头来关掉另一边

「区间DP」关路灯

关路灯 原题链接:关路灯 题目大意 给你一条直线,直线上有\(n\)个点,每个点每秒都有消耗能量,现在再给你个点\(m\),代表你当前的位置,现在你要去碰这些点,当你碰到这些点时,这些点就不再消耗能量,你的速度是1m/s,现在让你求碰完这些点消耗能量最少,且最少值为多少 题目题解 看了一下题,哎,这题还写了不能用贪心,那就dp咯,还发现每次只能碰一个点,那似乎可以用区间动规\(dp_{i, j}\)来表示我们目前的状态,代表已经碰了 \(i, j\) 这个区间的点时所消耗的最小能量,用小区间去合

洛谷P1220 关路灯(区间dp)

关路灯 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯.为了给村里节省电费,老张记录下了每盏路灯的位置和功率,他每次关灯时也都是尽快地去关,但是老张不知道怎样去关灯才能够最节省电.他每天都是在天亮时首先关掉自己所处位置的路灯,然后可以向左也可以向右去关灯.开始他以为先算一下左边路灯的总功率再算一下右边路灯的总功率,然后选择先关掉功率大的一边,再回过头来关掉另一边的路

洛谷P1220关路灯——区间DP

题目:https://www.luogu.org/problemnew/show/P1220 区间DP. 代码如下: #include<iostream> #include<cstdio> using namespace std; int n,c,pos[55],w[55],sum,s[55][55],dp[55][55][3],INF=10000006; int main() { scanf("%d%d",&n,&c); for(int i=1

P1220 关路灯(区间规划)

题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了给村里节省电费,老张记录下了每盏路灯的位置和功率,他每次关灯时也都是尽快地去关,但是老张不知道怎样去关灯才能够最节省电.他每天都是在天亮时首先关掉自己所处位置的路灯,然后可以向左也可以向右去关灯.开始他以为先算一下左边路灯的总功率再算一下右边路灯的总功率,然后选择先关掉功率大的一边,再回过头来关掉另一边

[luoguP1220] 关路灯(DP)

传送门 如果去关某一个灯,那么途中经过的灯都能关闭,那么就是连续一段区间,区间DP. f[i][j][0] 表示关完 i, j 这个区间且在 i 这个位置 f[i][j][1] 表示关完 i, j 这个区间且在 j 这个位置 代码 #include <cstdio> #include <cstring> #include <iostream> #define N 1001 #define min(x, y) ((x) < (y) ? (x) : (y)) int

CSU1620: A Cure for the Common Code(KMP+区间DP)

Description Input Output Sample Input abcbcbcbca abbbcdcdcdabbbcdcdcd 0 Sample Output Case 1: 7 Case 2: 11 HINT Source 题意:把字符串简化,问简化得到的最短长度是多少 思路:要简化首先要求循环节,这里用kmp解决,而要求所有简化中最短的的话,用区间dp可以求得 <pre name="code" class="cpp">#include &