[BZOJ1511]火车票

来源:互联网 发布:unity3d 向目标移动 编辑:程序博客网 时间:2024/04/30 15:33

一个铁路线上有n(2<=n<=10000)个火车站,每个火车站到该线路的首发火车站距离都是已知的。任意两站之间的票价如下表所示:站之间的距离 X与票价的关系: 如果距离 :0 < X < =L1 则票价为C1 如果距离 :L1 < X < =L2 则票价为C2 如果距离 :L2 < X < =L3 则票价为C3 其中L1,L2,L3,C1,C2,C3都是已知的正整数,且(1 <= L1 < L2 < L3 <= 10^9, 1 <= C1 < C2 < C3 <= 10^9)。显然若两站之间的距离大于L3,那么从一站到另一站至少要买两张票。注意:每一张票在使用时只能从一站开始到另一站结束。 现在需要你对于给定的线路,求出从该线路上的站A到站B的最少票价。你能做到吗?


输入

输入文件的第一行为6个整数, L1, L2, L3, C1, C2, C3 (1 <= L1 < L2 < L3 <= 10^9, 1 <= C1 < C2 < C3 <= 10^9) ,这些整数由空格隔开.第二行为火车站的数量N (2 <= N <= 10000).第三行为两个不同的整数A、B,由空格隔开。接下来的 N-1 行包含从第一站到其他站之间的距离.这些距离按照增长的顺序被设置为不同的正整数。相邻两站之间的距离不超过L3. 两个给定火车站之间行程花费的最小值不超过10^9,而且任意两站之间距离不超过 10^9。


输出
输出文件中只有一个数字,表示从A到B要花费的最小值.

输入样例:
3 6 8 20 30 40
7
2 6
3
7
8
13
15

23


输出样例:

70


题解:dp[i]=dp[j]+cost(i,j)


#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>#include<cmath>#include<algorithm>using namespace std;const int N=10010;int L1, L2, L3, C1, C2, C3;int n, A, B, dp[N], L[N];int main() {scanf( "%d%d%d", &L1, &L2, &L3 );scanf( "%d%d%d", &C1, &C2, &C3 );scanf( "%d%d%d", &n, &A, &B );for( int i=2; i<=n; i++ ) scanf( "%d", &L[i] );memset( dp, 0x7f, sizeof dp ); dp[A]=0;//注意要清成0x7f7f7f7f7,0x3f3f3f3f要wafor(int i=A; i<=B; i++ ) {for(int j=i-1; j>=A && L[i]-L[j]<=L3; j-- ) {int dis=L[i]-L[j];if( dis<=L1 ) dp[i]=min( dp[i], dp[j]+C1 );else if( dis<=L2 ) dp[i]=min( dp[i], dp[j]+C2 );else if( dis<=L3 ) dp[i]=min( dp[i], dp[j]+C3 );}}printf( "%d\n", dp[B] );return 0;}


原创粉丝点击