【codevs1349】 (板猪的)火车票 解题报告

板猪的火车票  codevs1349黄金Gold

题目描述 Description

奸商zn(请勿对号入座)开办了一家火车公司,弱弱的板猪要去看望她的朋友小板猪,万恶的zn对板猪实施各种提高价,板猪不寒而栗。。。

铁路线上有n(2<=n<=10000)个火车站,每个火车站到该线路的首发火车站距离都是已知的。任意两站之间的票价如下表所示:

站之间的距离 - X      票价

0       C1

L1          C2

L2          C3

其中L1L2L3C1C2C3都是已知的正整数,且(1 <= L1 < L2 < L3 <= 10^9, 1 <= C1 < C2 < C3 <= 10^9)。显然若两站之间的距离大于L3,那么从一站到另一站至少要买两张票。注意:每一张票在使用时只能从一站开始到另一站结束。

现在板猪要从AB,为了不让奸商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).第三行为两个不同的整数AB,由空格隔开。接下来的 N-1 行包含从第一站到其他站之间的距离.这些距离按照增长的顺序被设置为不同的正整数。相邻两站之间的距离不超过L3. 两个给定火车站之间行程花费的最小值不超过10^9,而且任意两站之间距离不超过 10^9

输出描述 Output Description

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

样例输入 Sample Input

3 6 8 20 30 40

7

2 6

3

7

8

13

15

23

样例输出 Sample Output

70

【解题思路】

其实这就是一个水水的动归,,不过刚开始我困住了。。后来才知道原来动归还可以这么写。。。

f[i]表示从起点到i的最少花费,所以目标值是f[t];

就是一个最简单的动归,,,我只不过是被迷惑了双眼。。。不过我动归的渣渣我承认。。。

【代码】

#include
#include
#include
using namespace std;
int l1,l2,l3,c1,c2,c3,n,s,t,c,i,j;
int a[5005];
long long f[5005];

int main()
{
	scanf("%d%d%d%d%d%d",&l1,&l2,&l3,&c1,&c2,&c3);
	scanf("%d",&n);
	scanf("%d%d",&s,&t);
	if (s>t)
	{
		c=s;
		s=t;
		t=c;
	}
	if (s==t) 
	{
		printf("0");
		return 0;
	}
	a[1]=0;
	for (i=2;i<=n;++i)
	  scanf("%d",&a[i]);
	memset(f,127,sizeof(f));
	f[s]=0;
	for (i=s+1; i<=t; ++i)
	  for (j=s; j<=t-1; ++j)
	  {
	  	if (a[i]-a[j]<=l1)
	  	  if (f[j]+c1l1&&a[i]-a[j]<=l2)
	  	  if (f[j]+c2l2&&a[i]-a[j]<=l3)
	  	  if (f[j]+c3


你可能感兴趣的:(题解,dp)