ΠΠΎΡΠ»Π΅Π΄Π½ΡΡ Π² ΡΡ
ΠΎΠ΄ΡΡΠ΅ΠΌ Π³ΠΎΠ΄Ρ Π·Π°Π΄Π°ΡΠ° 983. Minimum Cost For Tickets ΡΡΠ΅Π±ΡΠ΅Ρ ΠΎΡ Π½Π°Ρ Π½Π΅ΡΠ»ΠΎΠΆΠ½ΠΎΠ³ΠΎ ΡΠΎΡΠ΅ΡΠ°Π½ΠΈΡ ΡΠ΅Ρ
Π½ΠΈΠΊ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΡΠΊΠΎΠ»ΡΠ·ΡΡΠ΅Π³ΠΎ ΠΎΠΊΠ½Π°.
π Π£ΡΠ»ΠΎΠ²ΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ
Π£ Π²Π°Ρ Π΅ΡΡΡ Π·Π°ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π΄Π½ΠΈ ΠΏΠΎΠ΅Π·Π΄ΠΎΠΊ Π² ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π³ΠΎΠ΄Π°, ΡΠΊΠ°Π·Π°Π½Π½ΡΠ΅ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ days
. ΠΠΈΠ»Π΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠΎΠ±ΡΠ΅ΡΡΠΈ ΠΏΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΡΠ΅Π½Π°ΠΌ:
- ΠΠ΄Π½ΠΎΠ΄Π½Π΅Π²Π½ΡΠΉ Π±ΠΈΠ»Π΅Ρ Π·Π°
costs[0]
Π΄ΠΎΠ»Π»Π°ΡΠΎΠ².
- Π‘Π΅ΠΌΠΈΠ΄Π½Π΅Π²Π½ΡΠΉ Π±ΠΈΠ»Π΅Ρ (ΠΏΠΎΠΊΡΡΠ²Π°Π΅Ρ Π»ΡΠ±ΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΈΠ΄ΡΡΠΈΠ΅ 7 Π΄Π½Π΅ΠΉ) Π·Π°
costs[1]
Π΄ΠΎΠ»Π»Π°ΡΠΎΠ².
- Π’ΡΠΈΠ΄ΡΠ°ΡΠΈΠ΄Π½Π΅Π²Π½ΡΠΉ Π±ΠΈΠ»Π΅Ρ (ΠΏΠΎΠΊΡΡΠ²Π°Π΅Ρ Π»ΡΠ±ΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΈΠ΄ΡΡΠΈΠ΅ 30 Π΄Π½Π΅ΠΉ) Π·Π°
costs[2]
Π΄ΠΎΠ»Π»Π°ΡΠΎΠ².
ΠΠ΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠ΅ Π·Π°ΡΡΠ°ΡΡ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠΊΡΡΡΡ Π²ΡΠ΅ Π΄Π½ΠΈ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° days
.
π‘ ΠΠ΄Π΅Ρ
ΠΠ»Ρ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ Π·Π°ΡΡΠ°Ρ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅.
ΠΡΠ½ΠΎΠ²Π½Π°Ρ ΠΈΠ΄Π΅Ρ β ΠΏΠΎΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎ Π²ΡΡΠΈΡΠ»ΡΡΡ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΡ ΡΡΠΎΠΈΠΌΠΎΡΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π΄Π°ΡΡ ΠΈΠ· ΠΌΠ°ΡΡΠΈΠ²Π° days
, ΡΡΠΈΡΡΠ²Π°Ρ ΡΠ°Π·Π½ΡΠ΅ Π²ΠΈΠ΄Ρ Π±ΠΈΠ»Π΅ΡΠΎΠ², Π° ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ½Π΄Π΅ΠΊΡΡ ΡΠΊΠΎΠ»ΡΠ·ΡΡΠΈΡ
ΠΎΠΊΠΎΠ½ Π΄Π»Ρ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ² ΠΏΠΎΠΊΡΡΡΠΈΡ Π±ΠΈΠ»Π΅ΡΠΎΠ².
π οΈ ΠΠ΅ΡΠ°Π»ΠΈ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄Π°
- Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΌΠ°ΡΡΠΈΠ²
dp
, Π³Π΄Π΅ dp[i]
Ρ
ΡΠ°Π½ΠΈΡ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΡ ΡΡΠΎΠΈΠΌΠΎΡΡΡ ΠΏΠΎΠ΅Π·Π΄ΠΎΠΊ Π΄Π»Ρ ΠΏΠ΅ΡΠ²ΡΡ
i
Π΄Π½Π΅ΠΉ.
- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π΄Π²Π° ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ
last7_index
ΠΈ last30_index
Π΄Π»Ρ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ Π½Π°ΡΠ°Π»Π° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° Π΄Π½Π΅ΠΉ, ΠΏΠΎΠΊΡΡΠ²Π°Π΅ΠΌΡΡ
7
-Π΄Π½Π΅Π²Π½ΡΠΌ ΠΈ 30
-Π΄Π½Π΅Π²Π½ΡΠΌ Π±ΠΈΠ»Π΅ΡΠ°ΠΌΠΈ.
- ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π΄Π½Ρ:
- ΠΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ, ΡΡΠΎΠ±Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ, Ρ ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΊΡΡΡΡ Π΄Π΅Π½Ρ ΡΠ΅ΠΊΡΡΠΈΠΌ Π±ΠΈΠ»Π΅ΡΠΎΠΌ.
- Π Π°ΡΡΡΠΈΡΡΠ²Π°Π΅ΠΌ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΡ ΡΡΠΎΠΈΠΌΠΎΡΡΡ, ΡΡΠ°Π²Π½ΠΈΠ²Π°Ρ ΡΡΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ
Π²Π°ΡΠΈΠ°Π½ΡΠ°: ΠΏΠΎΠΊΡΠΏΠΊΠ°
1
-Π΄Π½Π΅Π²Π½ΠΎΠ³ΠΎ, 7
-Π΄Π½Π΅Π²Π½ΠΎΠ³ΠΎ ΠΈ 30
-Π΄Π½Π΅Π²Π½ΠΎΠ³ΠΎ Π±ΠΈΠ»Π΅ΡΠΎΠ².
- ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· ΠΌΠ°ΡΡΠΈΠ²Π°
dp
, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΡ ΡΡΠΎΠΈΠΌΠΎΡΡΡ Π΄Π»Ρ Π²ΡΠ΅Ρ
ΠΏΠΎΠ΅Π·Π΄ΠΎΠΊ.
π ΠΡΠΈΠΌΠΏΡΠΎΡΠΈΠΊΠ°
- ΠΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ:
O(n)
, Π³Π΄Π΅ n
β ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π΄Π½Π΅ΠΉ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ days
.
- ΠΠ°ΠΆΠ΄ΡΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ (last7_index, last30_index) ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΡΡΡ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°Π·Π° Π½Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ Π΄Π΅Π½Ρ.
- ΠΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅Π½Π½Π°Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ:
O(n)
- Π΄Π»Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ ΠΌΠ°ΡΡΠΈΠ²Π°
dp
.
π ΠΠΎΠ΄
impl Solution {
pub fn mincost_tickets(days: Vec<i32>, costs: Vec<i32>) -> i32 {
// Dynamic programming array to store minimum costs for each day in `days`
let n = days.len();
let mut dp = vec![0; n + 1]; // dp[i] is the minimum cost to cover days[0..i-1]
let mut last7_index = 0; // Pointer for the last valid day for a 7-day pass
let mut last30_index = 0; // Pointer for the last valid day for a 30-day pass
for i in 0..n {
// Update the pointer for the last valid day covered by a 7-day pass
while days[last7_index] <= days[i] - 7 {
last7_index += 1;
}
// Update the pointer for the last valid day covered by a 30-day pass
while days[last30_index] <= days[i] - 30 {
last30_index += 1;
}
// Calculate the minimum cost for the current day
dp[i + 1] = dp[i] + costs[0]; // Cost with a 1-day pass
dp[i + 1] = dp[i + 1].min(dp[last7_index] + costs[1]); // Cost with a 7-day pass
dp[i + 1] = dp[i + 1].min(dp[last30_index] + costs[2]); // Cost with a 30-day pass
}
// Return the total minimum cost to cover all travel days
dp[n]
}
}