解决方案
方法一:动态规划(日期变量型)
思路与算法
某天,如果你不必出行的话,等一等再购买火车票一定更优,如果你需要出行的话,那么就有三种选择:在通行期为 1 天、7 天、30 天中的火车票中选择一张购买。
我们可以把这种选择的过程表示成递归的形式,然后使用动态规划解决(记忆话搜索)。我们定义 dp(i) 为能够完成从第 i 天到最后的旅游计划的最小花费。那么,如果你在第 i 天需要出行的话,你的花费为:
复杂度分析
-
时间复杂度:,其中 是旅行计划中日期的最大值。
-
空间复杂度:。
方法二:动态规划(窗口变量型)
思路与算法
在 方法一 中,我们只需要在有出行需求的日期购买火车票就可以了。
现在,我们令 dp(i) 表示能够完成从 days[i] 到最后的旅行计划的最小花费。如果说 j1 是最大的下标满足 days[j1] < days[i] + 1,j7 是最大的下标满足 days[j7] < days[i] + 7, j30 是最大的下标满足 days[j30] < days[i] + 30,那么就有:
复杂度分析
-
时间复杂度:,其中 是旅行计划中不同出行日期的数量。
-
空间复杂度:。