- Trending Categories
- Data Structure
- Networking
- RDBMS
- Operating System
- Java
- iOS
- HTML
- CSS
- Android
- Python
- C Programming
- C++
- C#
- MongoDB
- MySQL
- Javascript
- PHP

- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who

Suppose there is a country, that is popular for train travel, we have planned some train travelling one year in advance. We have an array, that is holding the days of the year that we will travel. Each day is an integer from 1 to 365. Train tickets are sold in three different ways −

A 1-day pass is sold for costs[0] dollars;

A 1-day pass is sold for costs[0] dollars;

A 30-day pass is sold for costs[2] dollars.

Here the passes allow that many days of consecutive travel. For example, if we get one 7-day pass on day 2, then we can travel for 7 days: day consecutively (2, 3, 4, 5, 6, 7, and 8). We have to find the minimum number of dollars we need to travel every day in the given list of days. So if the input is like [1,4,6,7,8,20] and costs are [2,7,15], then the output will be 11.

On day 1, we have bought 1 day pass for costs[0] = $2, that is covering day 1, on day 3, we have bought 7 day pass, so cost[1] = $7, that is covering days 3 to 9, and on day 20, again bought a pass for 1 day, so cost[0] = $2, that is covering day 20. So in total $11 are spent.

To solve this, we will follow these steps −

create one array called dp, of size 366

j := 0

for i in range 1 to 366

dp[i] := cost[0] + dp[i - 1]

if i – 7 >= 0, then dp[i] := minimum of dp[i - 7] + cost[1] and dp[i]

if i – 30 >= 0, then dp[i] := minimum of dp[i - 30] + cost[2] and dp[i]

if j < size of the days array and days[j] = i, then increase j by 1, otherwise dp[i] := minimum of dp[i], dp[i – 1]

return dp[365]

Let us see the following implementation to get better understanding −

#include <bits/stdc++.h> using namespace std; class Solution { public: int mincostTickets(vector<int>& days, vector<int>& costs) { vector <int> dp(366); int j = 0; for(int i = 1; i < 366; i++){ dp[i] = costs[0] + dp[i - 1]; if(i - 7 >= 0){ dp[i] = min(dp[i - 7] + costs[1], dp[i]); } if(i - 30 >= 0){ dp[i] = min(dp[i - 30] + costs[2], dp[i]); } if(j < days.size() && days[j] == i){ j++; }else dp[i] = min(dp[i], dp[i - 1]); } return dp[365]; } }; main(){ vector<int> v = {1,4,6,7,8,20}; vector<int> v1 = {2,7,15}; Solution ob; cout << (ob.mincostTickets(v, v1)); }

[1,4,6,7,8,20] [2,7,15]

11

- Related Questions & Answers
- C Program for Minimum Cost Path
- Minimum Cost to Connect Sticks in C++
- Minimum Cost to Merge Stones in C++
- Minimum Cost Polygon Triangulation
- Minimum Cost to Hire K Workers in C++
- Minimum Cost To Make Two Strings Identical in C++
- Find minimum cost to buy all books in C++
- Find minimum adjustment cost of an array in C++
- Connect n ropes with minimum cost
- Program to find minimum total cost for equalizing list elements in Python
- Minimum Cost to make two Numeric Strings Identical in C++
- Minimum Cost to cut a board into squares in C++
- Connecting Cities With Minimum Cost in Python
- Minimum Cost Tree From Leaf Values in Python
- Find minimum adjustment cost of an array in Python

Advertisements