1349 板猪的火车票
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 黄金 Gold
题目描述 Description
奸商zn(请勿对号入座)开办了一家火车公司,弱弱的板猪要去看望她的朋友小板猪,万恶的zn对板猪实施各种提高价,板猪不寒而栗。。。
铁路线上有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,为了不让奸商zn敲竹杠,你能帮助板猪吗?
输入描述 Input Description
输入文件的第一行为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。
输出描述 Output Description
输出文件中只有一个数字,表示从A到B要花费的最小值.
样例输入 Sample Input
3 6 8 20 30 40
7
2 6
3
7
8
13
15
23
样例输出 Sample Output
70
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 /*基本思路:序列性DP 2 f[i]数组储存着从A到i的最小花费,它是由它之前的站点中可以用一张票坐过来的,以此更新*/ 3 #include<cstdio> 4 #include<iostream> 5 #include<cstring> 6 using namespace std; 7 #define N 10001 8 int l[4],c[4],n,A,B; 9 long long int sum[N],f[N]; 10 void input() 11 { 12 for(int i=1;i<=3;++i) 13 scanf("%d",&l[i]); 14 for(int i=1;i<=3;++i) 15 scanf("%d",&c[i]); 16 scanf("%d",&n); 17 sum[1]=0; 18 scanf("%d%d",&A,&B); 19 for(int i=2;i<=n;++i) 20 scanf("%d",&sum[i]); 21 } 22 int judge(int a,int b) 23 { 24 int cha=a-b; 25 if(a-b<=l[1]) return 1;/*让从t--i选取价格尽量低的票*/ 26 if(a-b<=l[2]) return 2;/*一二三是判断买那张票*/ 27 if(a-b<=l[3]) return 3; 28 return 0; 29 } 30 void DP() 31 { 32 memset(f,127,sizeof(f)); 33 f[A]=0; 34 int flag=0; 35 for(int i=A+1;i<=B;++i) 36 for(int t=A;t<=i-1;++t) 37 { 38 flag=judge(sum[i],sum[t]);/*判读买那张票*/ 39 if(!flag) continue;/*不能一次到达*/ 40 f[i]=min(f[i],f[t]+c[flag]);/*否则的话更新f[i]的最小数*/ 41 } 42 } 43 int main() 44 { 45 input(); 46 DP(); 47 cout<<f[B]; 48 return 0; 49 }