-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy path983.MinimumCostForTickets.cpp
111 lines (105 loc) · 2.99 KB
/
983.MinimumCostForTickets.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/*
* @lc app=leetcode id=983 lang=cpp
*
* [983] Minimum Cost For Tickets
*
* https://leetcode.com/problems/minimum-cost-for-tickets/description/
*
* algorithms
* Medium (60.27%)
* Likes: 1825
* Dislikes: 35
* Total Accepted: 65.7K
* Total Submissions: 106K
* Testcase Example: '[1,4,6,7,8,20]\n[2,7,15]'
*
* In a country popular for train travel, you have planned some train
* travelling one year in advance. The days of the year that you will travel
* is given as an array days. Each day is an integer from 1 to 365.
*
* Train tickets are sold in 3 different ways:
*
*
* a 1-day pass is sold for costs[0] dollars;
* a 7-day pass is sold for costs[1] dollars;
* a 30-day pass is sold for costs[2] dollars.
*
*
* The passes allow that many days of consecutive travel. For example, if we
* get a 7-day pass on day 2, then we can travel for 7 days: day 2, 3, 4, 5, 6,
* 7, and 8.
*
* Return the minimum number of dollars you need to travel every day in the
* given list of days.
*
*
*
* Example 1:
*
*
* Input: days = [1,4,6,7,8,20], costs = [2,7,15]
* Output: 11
* Explanation:
* For example, here is one way to buy passes that lets you travel your travel
* plan:
* On day 1, you bought a 1-day pass for costs[0] = $2, which covered day 1.
* On day 3, you bought a 7-day pass for costs[1] = $7, which covered days 3,
* 4, ..., 9.
* On day 20, you bought a 1-day pass for costs[0] = $2, which covered day 20.
* In total you spent $11 and covered all the days of your travel.
*
*
*
* Example 2:
*
*
* Input: days = [1,2,3,4,5,6,7,8,9,10,30,31], costs = [2,7,15]
* Output: 17
* Explanation:
* For example, here is one way to buy passes that lets you travel your travel
* plan:
* On day 1, you bought a 30-day pass for costs[2] = $15 which covered days 1,
* 2, ..., 30.
* On day 31, you bought a 1-day pass for costs[0] = $2 which covered day 31.
* In total you spent $17 and covered all the days of your travel.
*
*
*
*
*
* Note:
*
*
* 1 <= days.length <= 365
* 1 <= days[i] <= 365
* days is in strictly increasing order.
* costs.length == 3
* 1 <= costs[i] <= 1000
*
*
*/
// @lc code=start
#include <vector>
#include <bits/stdc++.h>
class Solution {
public:
int mincostTickets(std::vector<int>& days, std::vector<int>& costs) {
std::vector<int> min_costs(366, INT_MAX);
min_costs[0] = 0;
for(int day: days) {
min_costs[day] = 0; // mark for travel days
}
for (int i = 1; i < 366; i++) {
if (min_costs[i] == INT_MAX) {
min_costs[i] = min_costs[i - 1];
} else {
int min_cost = min_costs[i - 1] + costs[0];
min_cost = std::min(min_costs[std::max(0, i - 7)] + costs[1], min_cost);
min_cost = std::min(min_costs[std::max(0, i - 30)] + costs[2], min_cost);
min_costs[i] = min_cost;
}
}
return min_costs.back();
}
};
// @lc code=end