Блог пользователя heavenly_phoenix

Автор heavenly_phoenix, 12 лет назад, По-русски

Вопрос на ДП. Идей нету как решать этот вопрос. Благодарен за помощь.

  • Проголосовать: нравится
  • +1
  • Проголосовать: не нравится

»
12 лет назад, скрыть # |
← Rev. 2  
Проголосовать: нравится 0 Проголосовать: не нравится

В общем, динамика у тебя будет dp[S][K] = количество способов разбить число S в K слагаемых. Пересчет за куб: перебираешь сумму, число, которое ты сейчас добавишь, и количество слагаемых(то есть K).

Пересчет можно делать, например, так: dp[S + curr][K + 1] += dp[S][K]

»
12 лет назад, скрыть # |
 
Проголосовать: нравится +14 Проголосовать: не нравится

Можно вывести следующее рекуррентное соотношение: P(n, k) = P(n - 1, k - 1) + P(n - k, k) и решать задачу за O(nk).

Рассуждения имею следующий вид: упорядочим все слагаемые. Теперь посмотрим на наименьшее и разобьём все разбиения на два класса — те, у которых оно равно единице (таких будет P(n - 1, k - 1)) и те, у которых оно не равно единице. Чтобы посчитать количество вторых, воспользуемся следующим трюком — вычтем из всех слагаемых единичку. Теперь их число можно определить как P(n - k, k).