题目来源
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/meChtZ
原题内容
小扣打算去秋日市集,由于游客较多,小扣的移动速度受到了人流影响:
小扣从 x 号站点移动至 x + 1 号站点需要花费的时间为 inc;
小扣从 x 号站点移动至 x - 1 号站点需要花费的时间为 dec。
现有 m 辆公交车,编号为 0 到 m-1。小扣也可以通过搭乘编号为 i 的公交车,从 x 号站点移动至 jump[i]*x 号站点,耗时仅为 cost[i]。小扣可以搭乘任意编号的公交车且搭乘公交次数不限。
假定小扣起始站点记作 0,秋日市集站点记作 target,请返回小扣抵达秋日市集最少需要花费多少时间。由于数字较大,最终答案需要对 1000000007 (1e9 + 7) 取模。
注意:小扣可在移动过程中到达编号大于 target 的站点。
解释
输入:target = 31, inc = 5, dec = 3, jump = [6], cost = [10]
输出:33
解释:
小扣步行至 1 号站点,花费时间为 5;
小扣从 1 号站台搭乘 0 号公交至 6 * 1 = 6 站台,花费时间为 10;
小扣从 6 号站台步行至 5 号站台,花费时间为 3;
小扣从 5 号站台搭乘 0 号公交至 6 * 5 = 30 站台,花费时间为 10;
小扣从 30 号站台步行至 31 号站台,花费时间为 5;
最终小扣花费总时间为 33。
输入:target = 612, inc = 4, dec = 5, jump = [3,6,8,11,5,10,4], cost = [4,7,6,3,7,6,4]
输出:26
解释:
小扣步行至 1 号站点,花费时间为 4;
小扣从 1 号站台搭乘 0 号公交至 3 * 1 = 3 站台,花费时间为 4;
小扣从 3 号站台搭乘 3 号公交至 11 * 3 = 33 站台,花费时间为 3;
小扣从 33 号站台步行至 34 站台,花费时间为 4;
小扣从 34 号站台搭乘 0 号公交至 3 * 34 = 102 站台,花费时间为 4;
小扣从 102 号站台搭乘 1 号公交至 6 * 102 = 612 站台,花费时间为 7;
最终小扣花费总时间为 26。
约束
1 <= target <= 10^9
1 <= jump.length, cost.length <= 10
2 <= jump[i] <= 10^6
1 <= inc, dec, cost[i] <= 10^6
分析
起点 => 终点
终点 => 起点
假如这有一个在某站怎么选择行动的决策函数 R ,他有以下决策:
1.直接从当前站走回起点
2.当前没有快速公交,往前走几步到达公交站点坐快速公交去下一站再使用决策函数R
3.当前没有快速公交,往前后几步到达公交站点坐快速公交去下一站再使用决策函数R
4.假如当前站能坐快速公交,那就坐公交去下一站再使用决策函数R
对于决策函数的方法,只需求得其各方法的代价的最小代价
所设计知识点
解题
class Solution ( object ) {
def busRapidTransit ( self, target, inc, dec, jump, cost) :
"""
:type target: int
:type inc: int
:type dec: int
:type jump: List[int]
:type cost: List[int]
:rtype: int
"""
memo = dict ( )
def findroute ( cur_target) :
if cur_target== 0 :
return 0
if cur_target in memo:
return memo[ cur_target]
mincost = cur_target* inc
for i, val in enumerate ( jump) :
if cur_target> 1 :
if cur_target% val== 0 :
mincost = min ( mincost, cost[ i] + findroute( cur_target// val) )
else :
bias = cur_target% val
if cur_target- bias> 0 :
mincost= min ( mincost, bias* inc+ cost[ i] + findroute( cur_target// val) )
mincost = min ( mincost, ( val- bias) * dec+ cost[ i] + findroute( cur_target// val+ 1 ) )
memo[ cur_target] = mincost
return mincost
return findroute( target) % ( 1000000007 )
}