classSolution:defmincostTickets(self, days, costs)->int:
self.size =len(days)
self.costs = costs
self.res =float('inf')
self.helper(days,0)return self.res
defhelper(self, days, cost):"""回溯主逻辑"""ifnot days:# 当所有日期都已安排时进行结算
self.res =min(self.res, cost)returnif cost >= self.res:# 当前费用已不小于目前最小花费,中止returnfor index, c inenumerate([1,7,30]):
self.helper([i for i in days if i >= days[0]+ c], cost + self.costs[index])
动态规划解法
classSolution:defmincostTickets(self, days, costs)->int:
dp_arr =[0]*(days[-1]+1)# 维护一个长度为days[-1]+1的数组,用来记录每个位置的最低消费for i inrange(1, days[-1]+1):if i in days:# 若该天为待处理的日期,则从1,7,30中寻找最小代价
dp_arr[i]=min(dp_arr[max(0, i -1)]+ costs[0], dp_arr[max(0, i -7)]+ costs[1],
dp_arr[max(0, i -30)]+ costs[2])else:
dp_arr[i]= dp_arr[i -1]return dp_arr[-1]