983. Minimum Cost For Tickets 买票的最小花费
983. Minimum Cost For Tickets 买票的最小花费
题目描述:给定三种票分别是 1 日,7日和30日以及它们的票价costs,给定一年中的需要出行的日子,求最小花费
分析
典型的DP题,需要先搞清楚递推式,如果是第N天买票,那么总共的花费可以分成三种情况
- 昨天买了今天的车票
- 前七天的某一天(取最后一天)买了一张7天的车票
- 前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