главная новое лучшее написать
2

Ссылка на задачу — 2140. Solving Questions With Brainpower.

📋 Описание задачи

📌 Пример:

💡 Идея

Решение задачи требует на каждом шаге выбора между:

Если двигаться с конца к началу, можно заранее знать, какой результат нас ждёт после любого выбора.
Это делает задачу идеально подходящей для динамического программирования в обратном (реверсивном) порядке вычислений.

🔧 Подробности подхода

  1. Создаём массив dp длиной n + 1 (dp[i] — максимум очков, которые можно набрать, начиная с вопроса i).
  2. Обходим questions в обратном порядке
  3. Для каждого вопроса:
    • Вычисляем индекс next, с которого можно продолжить после решения текущего.
    • Вычисляем два варианта:
      • take = points + dp[next] — если решаем.
      • skip = dp[i+1] — если пропускаем.
    • Обновляем dp[i] как max(take, skip).
  4. Финальный ответ в dp[0].

📈 Асимптотики

🧾 Исходный код

impl Solution {
    pub fn most_points(questions: Vec<Vec<i32>>) -> i64 {
        let n = questions.len();
        let mut dp = vec![0i64; n + 1]; // dp[i] = max points starting from question i

        questions.iter().enumerate().rev().fold(dp[n], |acc, (idx, vec)| {
            let [points, brainpower] = vec[..] else { unreachable!("unexpected input format") };
            let next = n.min(idx + brainpower as usize + 1);
            let take = points as i64 + dp[next]; // Solve this question
            dp[idx] = acc.max(take); // Max between solving and skip strategies
            dp[idx]
        })
    }
}

Tags: #rust #algorithms #dynamic #dp #optimization