POJ 2355 Railway tickets (线性dp)

59 篇文章 0 订阅

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;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值