本题虽然看上去DP套路题,但本质还是需要一点贪心的思想。那就是当j小于i时,前j天能乘车的花费一定小于等于前i天能乘车的花费!否则前j天乘车的方案肯定不合算,我们直接采用后者代替就行了。有了这个公理,DP就方便了很多。
假设第i天当日我们不需要乘车,那么前i天乘车的花费dp[i]就完全等同于dp[i-1]。
假设第i天当日我们需要乘车,那么dp[i]只需要考虑三种前驱状态:1. 在第i-1天买张日票,2. 在第i-7天买张周票,3. 在第i-30天买张月票,所以dp[i]就是在dp[i-1]+cost[0], dp[i-7]+cost[1], dp[i-30]+cost[2]中取最小值就可。
有人会说,第i天不一定要是一张票的截止日期呀,dp[i]的最优状态会不会可能是在第i-2天买张周票得到的?根据之前的引理,dp[i-7]<=dp[i-2]。同样是保证第i天能乘车,同样是买张周票,在第i-2天买肯定不如在第i-7天的时候买合算。这样的反思保证了我们的状态转移方程是充分的。
其他的细节需要注意:比如考虑买周票,但i-7小于零的话,那么应该有dp[i] = dp[0]+cost[1],其中dp[0]的值是零。