[Swift]LeetCode983. 最低票价 | Minimum Cost For Tickets

原文地址:http://www.javashuo.com/article/p-xtcynxoy-md.html html

In a country popular for train travel, you have planned some train travelling one year in advance.  The days of the year that you will travel is given as an array days.  Each day is an integer from 1 to 365.数组

Train tickets are sold in 3 different ways:spa

  • a 1-day pass is sold for costs[0] dollars;
  • a 7-day pass is sold for costs[1] dollars;
  • a 30-day pass is sold for costs[2] dollars.

The passes allow that many days of consecutive travel.  For example, if we get a 7-day pass on day 2, then we can travel for 7 days: day 2, 3, 4, 5, 6, 7, and 8.code

Return the minimum number of dollars you need to travel every day in the given list of dayshtm

Example 1:blog

Input: days = [1,4,6,7,8,20], costs = [2,7,15] Output: 11 Explanation: For example, here is one way to buy passes that lets you travel your travel plan: On day 1, you bought a 1-day pass for costs[0] = $2, which covered day 1. On day 3, you bought a 7-day pass for costs[1] = $7, which covered days 3, 4, ..., 9. On day 20, you bought a 1-day pass for costs[0] = $2, which covered day 20. In total you spent $11 and covered all the days of your travel. 

Example 2:get

Input: days = [1,2,3,4,5,6,7,8,9,10,30,31], costs = [2,7,15] Output: 17 Explanation: For example, here is one way to buy passes that lets you travel your travel plan: On day 1, you bought a 30-day pass for costs[2] = $15 which covered days 1, 2, ..., 30. On day 31, you bought a 1-day pass for costs[0] = $2 which covered day 31. In total you spent $17 and covered all the days of your travel. 

Note:input

  1. 1 <= days.length <= 365
  2. 1 <= days[i] <= 365
  3. days is in strictly increasing order.
  4. costs.length == 3
  5. 1 <= costs[i] <= 1000

在一个火车旅行很受欢迎的国度,你提早一年计划了一些火车旅行。在接下来的一年里,你要旅行的日子将以一个名为 days 的数组给出。每一项是一个从 1 到 365 的整数。it

火车票有三种不一样的销售方式:io

  • 一张为期一天的通行证售价为 costs[0] 美圆;
  • 一张为期七天的通行证售价为 costs[1] 美圆;
  • 一张为期三十天的通行证售价为 costs[2] 美圆。

通行证容许数天无限制的旅行。 例如,若是咱们在第 2 天得到一张为期 7 天的通行证,那么咱们能够连着旅行 7 天:第 2 天、第 3 天、第 4 天、第 5 天、第 6 天、第 7 天和第 8 天。

返回你想要完成在给定的列表 days 中列出的每一天的旅行所须要的最低消费。 

示例 1:

输入:days = [1,4,6,7,8,20], costs = [2,7,15]
输出:11
解释: 
例如,这里有一种购买通行证的方法,能够让你完成你的旅行计划:
在第 1 天,你花了 costs[0] = $2 买了一张为期 1 天的通行证,它将在第 1 天生效。
在第 3 天,你花了 costs[1] = $7 买了一张为期 7 天的通行证,它将在第 3, 4, ..., 9 天生效。
在第 20 天,你花了 costs[0] = $2 买了一张为期 1 天的通行证,它将在第 20 天生效。
你总共花了 $11,并完成了你计划的每一天旅行。

示例 2:

输入:days = [1,2,3,4,5,6,7,8,9,10,30,31], costs = [2,7,15]
输出:17
解释:
例如,这里有一种购买通行证的方法,能够让你完成你的旅行计划: 
在第 1 天,你花了 costs[2] = $15 买了一张为期 30 天的通行证,它将在第 1, 2, ..., 30 天生效。
在第 31 天,你花了 costs[0] = $2 买了一张为期 1 天的通行证,它将在第 31 天生效。 
你总共花了 $17,并完成了你计划的每一天旅行。 

提示:

  1. 1 <= days.length <= 365
  2. 1 <= days[i] <= 365
  3. days 按顺序严格递增
  4. costs.length == 3
  5. 1 <= costs[i] <= 1000

124ms

 1 class Solution {
 2     func mincostTickets(_ days: [Int], _ costs: [Int]) -> Int {
 3         var n:Int = days.count
 4         var dp:[Int] = [Int](repeating:Int.max / 2,count:n+1)
 5         dp[0] = 0
 6         for i in 1...n
 7         {
 8             dp[i] = dp[i-1] + costs[0]
 9             for j in (0...(i - 1)).reversed()
10             {
11                 if days[i-1] - days[j] + 1 <= 7
12                 {
13                     dp[i] = min(dp[i], dp[j] + costs[1])
14                 }
15                 if days[i-1] - days[j] + 1 <= 30
16                 {
17                     dp[i] = min(dp[i], dp[j] + costs[2])
18                 }
19             }
20         }
21         return dp[n]
22     }
23 }
相关文章
相关标签/搜索