983. Minimum Cost For Tickets [JavaScript]

一、解题思路

  定义状态:

  dp[i]表示第days[i]天所花费的最少票价

  边界状态:

  dp[0] = 0

  以下述条件为例:

  days = [1,4,6,7,8,20]
  costs = [2,7,15]

  在寻找状态转移方程之前,首先要明白当前状态是由该状态之前的状态推导出来的,上述示例推导的过程为:

  # 第1天
  cost[0] + dp[0] = 2

  dp[1] = 2

  # 第二天
  cost[0] + dp[1] = 4
  cost[1] + dp[0] = 7

  dp[2] = 4

  # 第三天
  cost[0] + dp[2] = 6
  cost[1] + dp[1] = 9
  cost[1] + dp[0] = 7

  dp[3] = 6

  # 第4天
  cost[0] + dp[3] = 8
  cost[1] + dp[2] = 11
  cost[1] + dp[1] = 9
  cost[1] + dp[0] = 7

  dp[4] = 7

  # 第5天
  cost[0] + dp[4] = 9
  cost[1] + dp[3] = 13
  cost[1] + dp[2] = 11
  cost[1] + dp[1] = 9
  cost[1] + dp[0] = 15

  dp[5] = 9

  # 第6天
  cost[0] + dp[5] = 11
  cost[2] + dp[4] = 22
  ....

  dp[6] = 11

  综上所述,大家基本可以看出转移转移公式了(数学公式太难敲,看代码吧ε=ε=ε=┏(゜ロ゜;)┛):

二、代码实现

const mincostTickets = (days, costs) => {
  const max = days.length
  if (!max) {
    return 0
  }

  const dp = [0]
  for (let i = 1; i <= max; i++) {
    dp[i] = costs[0] + dp[i - 1]
    let dis = 0
    for (let j = i - 1; j >= 1; j--) {
      dis = days[i - 1] - days[j - 1]
      if (dis <= 6) {
        dp[i] = Math.min(dp[j - 1] + costs[1], dp[i])
      } else if (dis <= 29) {
        dp[i] = Math.min(dp[j - 1] + costs[2], dp[i])
      }
    }
  }
  return dp[max]
}

  如果本文对您有帮助,欢迎关注微信公众号,为您推送更多大前端相关的内容, 欢迎留言讨论,ε=ε=ε=┏(゜ロ゜;)┛。

  您还可以在这些地方找到我:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值