Вопрос на ДП. Идей нету как решать этот вопрос. Благодарен за помощь.
Вопрос на ДП. Идей нету как решать этот вопрос. Благодарен за помощь.
| № | Пользователь | Рейтинг |
|---|---|---|
| 1 | Benq | 3676 |
| 2 | Kevin114514 | 3659 |
| 3 | jiangly | 3640 |
| 4 | turmax | 3450 |
| 5 | tourist | 3408 |
| 6 | strapple | 3360 |
| 7 | Um_nik | 3354 |
| 8 | squareOf105 | 3348 |
| 9 | maroonrk | 3312 |
| 10 | idontwannadothis…e | 3191 |
| Страны | Города | Организации | Всё → |
| № | Пользователь | Вклад |
|---|---|---|
| 1 | Qingyu | 154 |
| 2 | nik_exists | 151 |
| 3 | maspy | 149 |
| 4 | AmShZ | 146 |
| 5 | Um_nik | 143 |
| 6 | Errichto | 139 |
| 7 | BledDest | 136 |
| 8 | adamant | 135 |
| 9 | maroonrk | 133 |
| 10 | cry | 130 |
| Название |
|---|



В общем, динамика у тебя будет dp[S][K] = количество способов разбить число S в K слагаемых. Пересчет за куб: перебираешь сумму, число, которое ты сейчас добавишь, и количество слагаемых(то есть K).
Пересчет можно делать, например, так: dp[S + curr][K + 1] += dp[S][K]
Спасибо
но подождите к чему равно curr
В curr ты перебираешь значения от 1 до N. Ограничения 150 же.
но отличающиеся только порядком слагаемых считаются одинаковыми
Как вариант, можно ввести третий параметр: последнее слагаемое, которое мы взяли. Тогда добавится один цикл еще. И мы всегда делаем пересчет из предыдущего слагаемого, меньшего или равного текущему. Это 5*10^8. Возможно, уложится в секунду.
Данную идею можно реализовать и за куб. Перебираем сумму S, число слагаемых K, последнее слагаемое T. Тогда
DP[S][K][T] = sum(DP[S - T][K - 1][X]: X ≤ T)
Последнее можно пересчитывать частичными суммами.
Можно вывести следующее рекуррентное соотношение: P(n, k) = P(n - 1, k - 1) + P(n - k, k) и решать задачу за O(nk).
Рассуждения имею следующий вид: упорядочим все слагаемые. Теперь посмотрим на наименьшее и разобьём все разбиения на два класса — те, у которых оно равно единице (таких будет P(n - 1, k - 1)) и те, у которых оно не равно единице. Чтобы посчитать количество вторых, воспользуемся следующим трюком — вычтем из всех слагаемых единичку. Теперь их число можно определить как P(n - k, k).