LeetCode 983. Minimum Cost For Tickets

56 阅读1分钟

🔗 leetcode.com/problems/mi…

题目

  • 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();
    }
};