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 = []() |