983.最低票价
题目描述:
在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行。在接下来的一年里,你要旅行的日子将以一个名为 days 的数组给出。每一项是一个从 1 到 365 的整数。
火车票有 三种不同的销售方式 :
- 一张 为期一天 的通行证售价为
costs[0]美元; - 一张 为期七天 的通行证售价为
costs[1]美元; - 一张 为期三十天 的通行证售价为
costs[2]美元。
通行证允许数天无限制的旅行。 例如,如果我们在第 2 天获得一张 为期 7 天 的通行证,那么我们可以连着旅行 7 天:第 2 天、第 3 天、第 4 天、第 5 天、第 6 天、第 7 天和第 8 天。
返回 你想要完成在给定的列表 days 中列出的每一天的旅行所需要的最低消费 。
数据范围:
$1\le days.len \le 365, 1\le days[i] \le 365$
days 按照顺序严格递增
题解:
当前买与不买对后面会造成影响。因此考虑加状态,或者换方式dp。
加状态:
使用 $dp[i][0/1/2/3]$ 表示第 $days[i]$ 天不买,买 $1$ 天,买 $7$ 天,买 $30$ 天的车票。需要使用二分查找找出来是否存在 $days[i] - 1/7/30$ 。
换方式dp:
从后往前,设 $dp[i]$ 表示从 $days[i]$ 到最后一天的最小花费。则第 $days[i]$ 天必须要买一张票,可以枚举买的是哪一种类型的票。
代码:
1 | auto optimize_cpp_stdio = []() |
1 | auto optimize_cpp_stdio = []() |