Ural 1031

题意:在一条铁路上有N个火车站,只有三种票,求两个车站之间的最少花费

方法:一开始以为是一道简单题,很NC的开了一个二位数组,很可惜,MLE了,而且中间还很SB的想到了用记忆化搜索可能比构建更快一些。。。

           经过大牛们的悉心指导,原来用一维就可以搞定 转移方程为f[j] = min(f[i] + GetCost(i,j)) (start <= i < j ,  start + 1 < j <=end) 不优化可能要超时,所以可以从j-1到start的方向寻找i ,中间不行即可break,算是一个剪枝吧。

代码: O(n^2)

 

 

其实还有O(n)的算法,关键在于寻找f[i]的时候只需要找三个地方

 

用一个p[i][j] 表示距离车站i 用第j中票能买到的最近的车站

这样转移方程就变成了f[j] = min(f[ p[j][k] ] + cost[j])

 

注意两个地方:第一个是计算P的时候需要istart和iend,所以要先交换再计算。第二个地方比较淫荡,当p[j][k]==j的时候,

f[j] > f[ p[j][k] ] + cost[k] 可能成立,因为f[j]开始赋值为INT_MAX,溢出了。。

 

代码:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值