雨へ痕
下一站路口,未知的道路

这个题目就是说两站间通过相应距离可以买相应的票,问你从某站到某站最小费用

dp,要知道买票的时候肯定是越接近最大距离越划算,后面的站的最小价格是由前面那些站的最小价决定的

所以、、、、、、

View Code
#include <stdio.h>
#define inf 1<<30
int L[3];
int C[3];
int n,s,t;
int a[10003];
int dp[10003];
int x,y,z;
inline
int min(int p,int q)
{
return p<q?p:q;
}

int main()
{
int temp;
int i;
while(scanf("%d%d%d%d%d%d",&L[0],&L[1],&L[2],&C[0],&C[1],&C[2])!=EOF)
{
scanf(
"%d",&n);
scanf(
"%d%d",&s,&t);
if(s>t)
{
temp
=s;
s
=t;
t
=temp;
}
a[
1]=0;
for(i=2;i<=n;i++)
{
scanf(
"%d",&a[i]);
}
dp[s]
=0;
x
=s,y=s,z=s;
for(i=s+1;i<=t;i++)
{
dp[i]
=inf;
//因为C0,C1,C2是递增的,所以不用担心买到不属于自己区间的票,肯定会选便宜的票
//要知道便宜的票都是合法的。
//复杂度o(3n)
while((a[i]-a[x])>L[0]) x++; //找出相距不大于L里面最近的点
while((a[i]-a[y])>L[1]) y++;
while((a[i]-a[z])>L[2]) z++;
dp[i]
=min(dp[i],dp[x]+C[0]);
dp[i]
=min(dp[i],dp[y]+C[1]);
dp[i]
=min(dp[i],dp[z]+C[2]);
}
printf(
"%d\n",dp[t]);
}
return 0;
}
posted on 2011-04-24 12:39  雨^痕  阅读(129)  评论(0)    收藏  举报