乘车费用

题目描述
有一狭长的海岛,岛上交通线路只有一条公路,且公路上每隔一千米就有一个车站,每个车站都有同样的乘车费用价目表(1~10 千米),且每一位乘客在任何一辆车上乘车不能超过 10 千米,但他途中可以换同方向的车多次。现有一乘客想乘车 n 千米,为使总费用最少,请你帮他求出最少的乘车费用 s。
注意:10 千米的费用比 1 千米少的情况是允许的。

输入
第一行共有 10 个不超过 200 的正整数,依次表示乘车 110 千米的费用,相邻两数间用一个空格隔开
第二行只有一个正整数:乘车的千米数 n

输出
只有一行且只有一个正整数:最少的乘车费用 s

样例输入
12 21 31 40 49 58 69 79 90 101
15

样例输出
147

数据范围限制
30% 的数据: 1 <= n <= 10 
70% 的数据: 1 <= n <= 100
100% 的数据: 1 <= n <= 1 000

提示
15 千米的路程,可以 5 千米、5 千米、5 千米分三次乘车;也可以 4 千米、5 千米、6 千米分三次乘车,其乘车的费用最少,s = 49+49+49 = 147 或 s = 40+49+58 = 147

这一题,我看第一眼暴力枚举?强行搜索?毕竟今天是来刷水题的,最后没想到居然是用DP做出来了这题。

思路详解

这题是一道十分简单的一道DP题(反正我是用DP做的)。
f[i]表示行驶前i千米最少花的价格。
先枚举1-n千米,再枚举1-min(i,10)千米,表示走前面的j千米。
那么如果f[i-j]+a[j]<f[i],也就是走前i-j千米加上走j千米的价格比之前算的走i千米的价格便宜,就把f[i]的值更新为f[i-j]+a[j]。
最后的答案就是f[n]。

核心代码

if(f[i-j]+a[j]<f[i])
//如果走前i-j千米加上走j千米的价格比之前算的走i千米的价格便宜
	f[i]=f[i-j]+a[j];
//把f[i]的值更新为f[i-j]+a[j]

这题其实也是比较简单的了。

代码信息

时间复杂度总时间
Θ(n)10n
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值