题目描述
有一狭长的海岛,岛上交通线路只有一条公路,且公路上每隔一千米就有一个车站,每个车站都有同样的乘车费用价目表(1~10 千米),且每一位乘客在任何一辆车上乘车不能超过 10 千米,但他途中可以换同方向的车多次。现有一乘客想乘车 n 千米,为使总费用最少,请你帮他求出最少的乘车费用 s。
注意:10 千米的费用比 1 千米少的情况是允许的。
输入
第一行共有 10 个不超过 200 的正整数,依次表示乘车 1~10 千米的费用,相邻两数间用一个空格隔开
第二行只有一个正整数:乘车的千米数 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 |