首页 > 代码库 > POJ 2355 Railway tickets (线性dp)

POJ 2355 Railway tickets (线性dp)

OJ题目 : click here~

题目分析:X为距离 , 当0<X<=L1, 票价为C1。 L1<X<=L2 ,票价为C2。L2<X<=L3,票价为C3。给每段车站时间的距离,求某两个车站之间的总票价的最小值。

设dp[ i ] 为到车站 i 的最少票价 。

则转移方程为dp[ i ] = min(dp[ j ] + 从j 到 i 的票价),j 为所有可以直接到 i 的车站。

要注意第一个数字 大于 第二个数字的情况。的确,题目没有说,从a 到 b。只说了a,b之间。要仔细读题啊,不能想当然。

AC_CODE

const int Max_l = 10002;
const int inf = 1<<30;
int dist[Max_l];//dist[i] 表示车站i 与i - 1的距离
int d[Max_l];
int dp[Max_l];
int main(){
    int L1 , L2 , L3 , C1 , C2 , C3 , n , m ,from , to , i , j , k;
    while(cin >> L1 >> L2 >> L3 >> C1 >> C2 >> C3){
        cin >> n >> from >> to;
        if(from > to) swap(from , to);
        dist[1] = 0;
        d[1] = 0;
        for(i = 2;i <= n;i++){
            scanf("%d",&d[i]);
            dist[i] = d[i] - d[i - 1];
        }
        for(i = 0;i <= n;i++)
            dp[i] = inf;
        dp[from] = 0;
        for(i = from + 1;i <= to;i++){
            int s = dist[i];
            for(j = i - 1;s <= L3&&j >= from;s += dist[j],j--){//如果从j 到 i
                if(0 < s && s <= L1) m = C1;
                if(L1 < s && s <= L2) m = C2;
                if(L2 < s && s <= L3) m = C3;
                dp[i] = min(dp[i] , dp[j] + m);
            }
        }
        cout << dp[to] << endl;
    }
    return  0;
}