解决方案
方法一:动态规划(日期变量型)
思路与算法
某天,如果你不必出行的话,等一等再购买火车票一定更优,如果你需要出行的话,那么就有三种选择:在通行期为 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
,那么就有:
复杂度分析
-
时间复杂度:,其中 是旅行计划中不同出行日期的数量。
-
空间复杂度:。