983. Minimum Cost For Tickets 买票的最小花费

983. Minimum Cost For Tickets 买票的最小花费

题目描述:给定三种票分别是 1 日,7日和30日以及它们的票价costs,给定一年中的需要出行的日子,求最小花费

分析

典型的DP题,需要先搞清楚递推式,如果是第N天买票,那么总共的花费可以分成三种情况

  1. 昨天买了今天的车票
  2. 前七天的某一天(取最后一天)买了一张7天的车票
  3. 前30天的某一天(取最后一天)买了一张30天的车票的花费

起始式只要保证所有的花费均从0开始即可

class Solution {
public:
    int mincostTickets(vector<int>& days, vector<int>& costs) {
         dp.insert({-30, 0});
        for(int d : days)
            dp[d]=min({costs[0]+cost(d-1), costs[1]+cost(d-7), costs[2]+cost(d-30)});
        return dp.rbegin()->second;
    }
    
    int cost(int d) {
        return prev(dp.upper_bound(d))->second;
    }
    map<int, int> dp;
};

收获

  • 加深对DP的理解
  • map 作为 dp 数组还是比较少见的,在N不连续的时候确实比开一个大数组要更节省
  • stl 函数的运用使得代码量大大降低

#DP