Вопрос на ДП. Идей нету как решать этот вопрос. Благодарен за помощь.
№ | Пользователь | Рейтинг |
---|---|---|
1 | tourist | 4009 |
2 | jiangly | 3823 |
3 | Benq | 3738 |
4 | Radewoosh | 3633 |
5 | jqdai0815 | 3620 |
6 | orzdevinwang | 3529 |
7 | ecnerwala | 3446 |
8 | Um_nik | 3396 |
9 | ksun48 | 3390 |
10 | gamegame | 3386 |
Страны | Города | Организации | Всё → |
№ | Пользователь | Вклад |
---|---|---|
1 | cry | 167 |
2 | Um_nik | 163 |
3 | maomao90 | 162 |
3 | atcoder_official | 162 |
5 | adamant | 159 |
6 | -is-this-fft- | 158 |
7 | awoo | 157 |
8 | TheScrasse | 154 |
9 | Dominater069 | 153 |
9 | nor | 153 |
Вопрос на ДП. Идей нету как решать этот вопрос. Благодарен за помощь.
Название |
---|
В общем, динамика у тебя будет 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).