
#include<iostream>
#include<vector>
using namespace std;const int inf = 1e9;
vector<int>dur_days = { 1,7,30 };
int f1(vector<int>& days, vector<int>& costs, int i) {if (i == days.size()) return 0;int ans = inf;for (int k = 0, j = i; k < 3; ++k) {while (j < days.size() && days[j] < days[i] + dur_days[k]) {j++;}ans = min(ans, costs[k] + f1(days, costs, j));}return ans;
}
int f2(vector<int>& days, vector<int>& costs, int i, vector<int>& dp) {if (i == days.size()) return 0;if (dp[i] != -1) return dp[i];int ans = inf;for (int k = 0, j = i; k < 3; ++k) {while (j < days.size() && days[j] < days[i] + dur_days[k]) {j++;}if (dp[j] != -1) ans = min(ans, costs[k] + dp[j]);else ans = min(ans, costs[k] + f2(days, costs, j, dp));}dp[i] = ans;return ans;
}
int f3(vector<int>& days, vector<int>& costs) {int n = days.size();vector<int>dp(n + 5, inf);dp[n] = 0;for (int i = n - 1; i >= 0; i--) {for (int k = 0, j = i; k < 3; ++k) {while (j < n && days[j] < days[i] + dur_days[k]) {j++;}dp[i] = min(dp[i], costs[k] + dp[j]);}}return dp[0];
}
int mincostTickets1(vector<int>& days, vector<int>& costs) {return f1(days, costs, 0);
}
int mincostTickets2(vector<int>& days, vector<int>& costs) {vector<int> dp(days.size() + 5, -1);return f2(days, costs, 0, dp);
}
int mincostTickets3(vector<int>& days, vector<int>& costs) {return f3(days, costs);
}
int main() {return 0;
}