-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path983.min-cost-ticket.py
54 lines (43 loc) · 1.22 KB
/
983.min-cost-ticket.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# Level: Medium
# TAGS: Array, Dynamic Programming
from typing import List
class Solution:
def minCostTickets(self, days: List[int], costs: List[int]) -> int:
day_set = set(days)
memo = {}
def dfs(day):
if day > 365:
return 0
if day in memo:
return memo[day]
if day in day_set:
memo[day] = min(dfs(day + d) + c for d, c in zip([1, 7, 30], costs))
else:
memo[day] = dfs(day + 1)
return memo[day]
return dfs(1)
def minCostTickets2(self, days: List[int], costs: List[int]) -> int:
dp = {}
def dfs(i):
if i == len(days):
return 0
if i in dp:
return dp[i]
dp[i] = float("inf")
for d, c in zip([1, 7, 30], costs):
j = i
while j < len(days) and days[j] < days[i] + d:
j += 1
dp[i] = min(dp[i], c + dfs(j))
return dp[i]
return dfs(0)
tests = [
(
([1, 4, 6, 7, 8, 20], [2, 7, 15]),
11,
),
(
([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 30, 31], [2, 7, 15]),
17,
),
]