// dp[i] 表示第i天的最少费用,如果这天不再计划中,那么dp[i] = dp[i-1],否则 dp[i] = min(dp[i-1]+cost[0], dp[i-7]+cost[1], dp[i-30]+cost[2]),这里为了处理越界,用max(0,i-30)处理即可。
class Solution {
public:
int mincostTickets(vector<int>& days, vector<int>& costs) {
// dp[i] 表示第i天旅行的最少费用。
unordered_set<int> travelDays;
for(auto day:days){
travelDays.insert(day);
}
int lastDay = days.back();
vector<int> dp(lastDay+1);
for(int i=1;i<=lastDay;i++){
if(!travelDays.count(i)){
dp[i] = dp[i-1];
}else{
dp[i] = min(dp[max(0,i-1)]+costs[0],min(dp[max(0,i-7)]+costs[1],dp[max(0,i-30)]+costs[2]));
}
}
return dp[lastDay];
}
};