สมมติว่ามีประเทศหนึ่งที่เป็นที่นิยมสำหรับการเดินทางด้วยรถไฟ เราได้วางแผนการเดินทางด้วยรถไฟล่วงหน้าหนึ่งปี เรามีอาร์เรย์ที่ถือวันของปีที่เราจะเดินทาง ในแต่ละวันเป็นจำนวนเต็มตั้งแต่ 1 ถึง 365 ตั๋วรถไฟมีจำหน่ายสามวิธี -
-
บัตรผ่านประเภท 1 วันจำหน่ายในราคา[0] ดอลลาร์
-
บัตรผ่านประเภท 1 วันจำหน่ายในราคา[0] ดอลลาร์
-
บัตรผ่าน 30 วันขายในราคา[2] ดอลลาร์
ที่นี่บัตรผ่านอนุญาตให้เดินทางติดต่อกันหลายวัน ตัวอย่างเช่น หากเราได้รับบัตรผ่าน 7 วันในวันที่ 2 เราก็สามารถเดินทางได้ 7 วัน:วันติดต่อกัน (2, 3, 4, 5, 6, 7 และ 8) เราต้องหาจำนวนเงินขั้นต่ำที่เราต้องเดินทางทุกวันในรายชื่อวันที่กำหนด ดังนั้นหากอินพุตเป็น [1,4,6,7,8,20] และต้นทุนเป็น [2,7,15] ผลลัพธ์จะเป็น 11
ในวันที่ 1 เราซื้อบัตร 1 วันในราคา[0] =$2 ซึ่งครอบคลุมวันที่ 1 วันที่ 3 เราซื้อบัตรแบบ 7 วัน ดังนั้น ราคา[1] =$7 ซึ่งครอบคลุมวันที่ 3 ถึง 9 และในวันที่ 20 ซื้อบัตรอีกครั้งเป็นเวลา 1 วัน ดังนั้นราคา[0] =$2 ซึ่งครอบคลุมวันที่ 20 ดังนั้นยอดใช้จ่ายทั้งหมด $11
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
สร้างหนึ่งอาร์เรย์ที่เรียกว่า dp ขนาด 366
-
เจ :=0
-
สำหรับผมอยู่ในช่วง 1 ถึง 366
-
dp[i] :=cost[0] + dp[i - 1]
-
ถ้า i – 7>=0 แล้ว dp[i] :=ขั้นต่ำของ dp[i - 7] + cost[1] และ dp[i]
-
ถ้า i – 30>=0 แล้ว dp[i] :=ขั้นต่ำของ dp[i - 30] + cost[2] และ dp[i]
-
ถ้า j <ขนาดของอาร์เรย์วันและวัน[j] =i ให้เพิ่ม j ขึ้น 1 มิฉะนั้น dp[i] :=ขั้นต่ำของ dp[i], dp[i – 1]
-
-
กลับ dp[365]
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#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