解决方案


方法一:动态规划(日期变量型)

思路与算法

某天,如果你不必出行的话,等一等再购买火车票一定更优,如果你需要出行的话,那么就有三种选择:在通行期为 1 天、7 天、30 天中的火车票中选择一张购买。

我们可以把这种选择的过程表示成递归的形式,然后使用动态规划解决(记忆话搜索)。我们定义 dp(i) 为能够完成从第 i 天到最后的旅游计划的最小花费。那么,如果你在第 i 天需要出行的话,你的花费为:

复杂度分析

  • 时间复杂度:,其中 是旅行计划中日期的最大值。

  • 空间复杂度:


方法二:动态规划(窗口变量型)

思路与算法

方法一 中,我们只需要在有出行需求的日期购买火车票就可以了。

现在,我们令 dp(i) 表示能够完成从 days[i] 到最后的旅行计划的最小花费。如果说 j1 是最大的下标满足 days[j1] < days[i] + 1j7 是最大的下标满足 days[j7] < days[i] + 7j30 是最大的下标满足 days[j30] < days[i] + 30,那么就有:

复杂度分析

  • 时间复杂度:,其中 是旅行计划中不同出行日期的数量。

  • 空间复杂度: