109.关路灯(区间dp)
多瑞卡得到了一份有趣而高薪的工作。每天早晨他必须关掉他所在村庄的街灯。所有的街灯都被设置在一条直路的同一侧。
多瑞卡每晚到早晨5点钟都在晚会上,然后他开始关灯。开始时,他站在某一盏路灯的旁边。
每盏灯都有一个给定功率的电灯泡,因为多端卡有着自觉的节能意识,他希望在耗能总数最少的情况下将所有的灯关掉。
多端卡因为太累了,所以只能以1m/s的速度行走。关灯不需要花费额外的时间,因为当他通过时就能将灯关掉。
编写程序,计算在给定路灯设置,灯泡功率以及多端卡的起始位置的情况下关掉所有的灯需耗费的最小能量。
输入文件的第一行包含一个整数N,2≤N≤1000,表示该村庄路灯的数量。
第二行包含一个整数V,1≤V≤N,表示多瑞卡开始关灯的路灯号码。
接下来的N行中,每行包含两个用空格隔开的整数D和W,用来描述每盏灯的参数,其中0≤D≤1000,0≤W≤1000。D表示该路灯与村庄开始处的距离(用米为单位来表示),W表示灯泡的功率,即在每秒种该灯泡所消耗的能量数。路灯是按顺序给定的。
输出文件的第一行即唯一的一行应包含一个整数,即消耗能量之和的最小值。注意结果小超过1,000,000,000。
4
3
2
5
6
8
56
分类标签 Tags 点此展开
我们发现关掉的路灯一定是连续的
然后就想到“
接着转移
首先想到dp[i][j]从dp[i+1][j]或者dp[i][j-1]转移过来
理论上会出现(以样例为例) dp[4][4]这样不合法的状态
那么限制一下端点也很容易搞定
还是有问题= =
也就是说这一步是在4号灯关了的情况下从3走到2
此时dp[i][j][0]表示最后一步落在i
到这里转移基本上很明了了
= =一开始我很傻
其实这个东西用一个sum[i][j]表示i~j的和就很容易了(况且关了灯的区间又是连续的)
自己的代码: