1086.最小花费(简单的dfs)

题目描述:
在某条线路上有N个火车站,有三种距离的路程,L1,L2,L3,对应的价格为C1,C2,C3.其对应关系如下:
距离s           票价
0<S<=L1         C1
L1<S<=L2        C2
L2<S<=L3        C3
输入保证0<L1<L2<L3<10^9,0<C1<C2<C3<10^9。
每两个站之间的距离不超过L3。
当乘客要移动的两个站的距离大于L3的时候,可以选择从中间一个站下车,然后买票再上车,所以乘客整个过程中至少会买两张票。
现在给你一个 L1,L2,L3,C1,C2,C3。然后是A B的值,其分别为乘客旅程的起始站和终点站。
然后输入N,N为该线路上的总的火车站数目,然后输入N-1个整数,分别代表从该线路上的第一个站,到第2个站,第3个站,……,第N个站的距离。
根据输入,输出乘客从A到B站的最小花费。
输入:
以如下格式输入数据:
L1  L2  L3  C1  C2  C3
A  B
N
a[2]
a[3]
……
a[N]
输出:
可能有多组测试数据,对于每一组数据,
根据输入,输出乘客从A到B站的最小花费。
样例输入:
1 2 3 1 2 3
1 2
2
2
样例输出:
2
#include<iostream>  
#include<algorithm>
#include<cmath> 
#define MAXN 10000  
#define INF  0xFFFFFFFFFF  
long long L1,L2,L3,C1,C2,C3;  
   
long long cost(long long l1,long long l2)  
{  
    if(abs(l1-l2)<=L1)  
        return C1;  
    else if(abs(l1-l2)<=L2)  
        return C2;  
    return C3;  
}  

long long min(long long a,long long b){
    return a<b ? a : b ;
}

int main()  
{  
    long long  i,j,k,dp[MAXN];  
    long long  start,end,N,L[MAXN];  
    while(cin>>L1>>L2>>L3>>C1>>C2>>C3)  
    {  
        cin>>start>>end;  
        cin>>N;  
        for(i=2;i<=N;i++)  
            cin<<L[i];  
        L[1]=0;  
        for(i=0;i<=MAXN;i++)  
            dp[i]=INF;  
        dp[start]=0;    
        for(i=start;i<=end;i++)  
        {  
            for(j=i+1;j<=end&&(L[j]-L[i])<=L3;j++)  
               dp[j]=min(dp[j],dp[i]+cost(L[i],L[j]));  
        }     
        cout<<dp[end]<<endl;  
    }  
    return 0;  
}  
原文地址:https://www.cnblogs.com/bernieloveslife/p/9736452.html