983. Minimum Cost For Tickets
mediumBuy 1-day, 7-day, or 30-day passes to cover all travel days at minimum cost. A day-indexed DP comparing three rolling lookbacks.
By Alex Chen, Founder, InterviewChamp.AI · Last verified
Problem
You have planned some train traveling one year in advance. The days of the year in which you will travel are given as an integer array days. Each day is an integer from 1 to 365. Train tickets are sold in three different ways: a 1-day pass is sold for costs[0] dollars, a 7-day pass is sold for costs[1] dollars, and 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: 2, 3, 4, 5, 6, 7, and 8. Return the minimum number of dollars you need to travel every day in the given list of days.
Constraints
1 <= days.length <= 3651 <= days[i] <= 365days is in strictly increasing order.costs.length == 31 <= costs[i] <= 1000
Examples
Example 1
days = [1,4,6,7,8,20], costs = [2,7,15]11Explanation: 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
days = [1,2,3,4,5,6,7,8,9,10,30,31], costs = [2,7,15]17Explanation: 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.
Solve it now
Free. No sign-up. Python and JavaScript run instantly in your browser.
Hints
Progressive — try the first before opening the next.
Hint 1
dp[d] = minimum cost to cover all travel days up to day d.
Hint 2
If d is not a travel day, dp[d] = dp[d-1]. Otherwise dp[d] = min(dp[d-1] + costs[0], dp[d-7] + costs[1], dp[d-30] + costs[2]).
Hint 3
Use max(0, d-k) for the lookback to handle the early-day boundary.
Solution approach
Reveal approach
Define dp[d] as the minimum cost to cover every travel day from 1 to d inclusive. Iterate d from 1 to last_day. If d is not in the travel set, dp[d] = dp[d-1] (no purchase needed). Otherwise dp[d] = min of three options: dp[d-1] + costs[0] (buy a 1-day pass that expires after d), dp[max(0, d-7)] + costs[1] (a 7-day pass purchased d-6 days ago still covers d), dp[max(0, d-30)] + costs[2] (similar for 30-day). Return dp[last_day]. Use a hash set for O(1) travel-day lookup. O(last_day) time, O(last_day) space — both bounded by 365.
Complexity
- Time
- O(D)
- Space
- O(D)
Related patterns
- dynamic-programming
Related problems
- 322. Coin Change
- 279. Perfect Squares
- 740. Delete and Earn
Asked at
Companies reported asking this problem (sourced from public Glassdoor, Blind, and Levels.fyi interview posts).
- Amazon
Practice these live with InterviewChamp.AI
Drill Minimum Cost For Tickets and DP 1D problems under real interview conditions with instant feedback on your reasoning, complexity claims, and code.
Practice these live with InterviewChamp.AI →