главная Π½ΠΎΠ²ΠΎΠ΅ Π»ΡƒΡ‡ΡˆΠ΅Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ

ПослСдняя Π² уходящСм Π³ΠΎΠ΄Ρƒ Π·Π°Π΄Π°Ρ‡Π° 983. Minimum Cost For Tickets Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΡ‚ нас нСслоТного сочСтания Ρ‚Π΅Ρ…Π½ΠΈΠΊ динамичСского программирования ΠΈ ΡΠΊΠΎΠ»ΡŒΠ·ΡΡ‰Π΅Π³ΠΎ ΠΎΠΊΠ½Π°.

πŸ“œ УсловиС Π·Π°Π΄Π°Ρ‡ΠΈ

Π£ вас Π΅ΡΡ‚ΡŒ Π·Π°ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π΄Π½ΠΈ ΠΏΠΎΠ΅Π·Π΄ΠΎΠΊ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π³ΠΎΠ΄Π°, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π² массивС days. Π‘ΠΈΠ»Π΅Ρ‚Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ приобрСсти ΠΏΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ Ρ†Π΅Π½Π°ΠΌ:

НСобходимо ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΡŒ всС Π΄Π½ΠΈ ΠΈΠ· списка days.

πŸ’‘ ИдСя

Для ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π·Π°Ρ‚Ρ€Π°Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ динамичСскоС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅.
Основная идСя β€” ΠΏΠΎΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π΄Π°Ρ‚Ρ‹ ΠΈΠ· массива days, учитывая Ρ€Π°Π·Π½Ρ‹Π΅ Π²ΠΈΠ΄Ρ‹ Π±ΠΈΠ»Π΅Ρ‚ΠΎΠ², Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ индСксы ΡΠΊΠΎΠ»ΡŒΠ·ΡΡ‰ΠΈΡ… ΠΎΠΊΠΎΠ½ для эффСктивного вычислСния Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ² покрытия Π±ΠΈΠ»Π΅Ρ‚ΠΎΠ².

πŸ› οΈ Π”Π΅Ρ‚Π°Π»ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°

  1. Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ массив dp, Π³Π΄Π΅ dp[i] Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΅Π·Π΄ΠΎΠΊ для ΠΏΠ΅Ρ€Π²Ρ‹Ρ… i Π΄Π½Π΅ΠΉ.
  2. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π΄Π²Π° указатСля last7_index ΠΈ last30_index для отслСТивания Π½Π°Ρ‡Π°Π»Π° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° Π΄Π½Π΅ΠΉ, ΠΏΠΎΠΊΡ€Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… 7-Π΄Π½Π΅Π²Π½Ρ‹ΠΌ ΠΈ 30-Π΄Π½Π΅Π²Π½Ρ‹ΠΌ Π±ΠΈΠ»Π΅Ρ‚Π°ΠΌΠΈ.
  3. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ дня:
    • ОбновляСм ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, с ΠΊΠ°ΠΊΠΎΠ³ΠΎ индСкса ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΡŒ дСнь Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ Π±ΠΈΠ»Π΅Ρ‚ΠΎΠΌ.
    • РассчитываСм ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ, сравнивая Ρ‚Ρ€ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°: ΠΏΠΎΠΊΡƒΠΏΠΊΠ° 1-Π΄Π½Π΅Π²Π½ΠΎΠ³ΠΎ, 7-Π΄Π½Π΅Π²Π½ΠΎΠ³ΠΎ ΠΈ 30-Π΄Π½Π΅Π²Π½ΠΎΠ³ΠΎ Π±ΠΈΠ»Π΅Ρ‚ΠΎΠ².
  4. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ послСднСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· массива 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]
    }
}