题目
- days 数组,表明在 1-365 天中,哪些天是可以用来旅行的
- cost 数组,表明买 1、7、30 天火车票的价格
- 返回旅行这么多天,需要花费的最少价格
思路
-
dp,表明在当前 today = days[index] 的最小花费,可以由以下三部分组成,取最小值
- today 买 1 天,dp[index - 1] + cost[0]
- today 买 7 天,找到 7 天前的最大 index,dp[new_index] + cost[1]
- today 买 30 天,找到 30 天前的最大 index,dp[new_index] + cost[2]
代码
class Solution {
public:
int find(vector<int>& days, vector<int>& dp, int t, int d) {
int begin = days[t] - d + 1;
if (days[0] >= begin) return 0;
while (t--) {
if (days[t] < begin)
return dp[t];
}
return 0;
}
int mincostTickets(vector<int>& days, vector<int>& costs) {
vector<int> dp(days.size());
for (int i = 0; i < days.size(); i++) {
int cost = find(days, dp, i, 1);
dp[i] = cost + costs[0];
cost = find(days, dp, i, 7);
dp[i] = min(dp[i], cost + costs[1]);
cost = find(days, dp, i, 30);
dp[i] = min(dp[i], cost + costs[2]);
}
return dp.back();
}
};