Как составить алгоритм решения задачи на ДП или Рекурсию (Задача на лесенку)?

aa85137e209c479e8e8176e8b5c21271.png

Читал, что такие задачи решаются так называемым "Динамическим Программированием", но к сожалению, хотя и понимаю суть этого метода, навыка решений оллимпиадных задач маловато.

Так же, сразу видно, что эту задачу можно решать рекурсивным перебором, но тоже не смог составить правильный алгоритм решения.

Хотелось бы получить совет о том, какую литературу или статьи почитать, для понимания таких задач.
А так же предложения о том, как решать задачу сабжа.

Мои попытки закончились провалом.
Лучшее к чему я пришел в теории, это подобие рекурсивного алгоритма: habrastorage.org/files/82b/160/5cc/82b1605cc82b414...
(Каждая лесенка уменьшается с конца на 1 кубик, и рассматривается "отрубленная" часть)

Но такой метод привел меня в тупик уже на 13 кубиках:
habrastorage.org/files/cf9/610/866/cf96108666db4ad...

Мой код: pastebin.com/XWE3QZgL

Где-то наткнулся на невероятно красивое решение на Java, переписал его на C++, но для меня это абсолютнейшая магия, возможно кто-то пояснит, что тут происходит, и на какую базу все это опирается: pastebin.com/6ACsC9ta
  • Вопрос задан
  • 6309 просмотров
Решения вопроса 1
Mrrl
@Mrrl
Заводчик кардиганов
Решить задачу легко - заводите массив A[N,N], в каждой клетке [K,M] которого будет записано число лесенок из K кубиков, нижний слой которых состоит из M кубиков. Число будет ненулевым, когда M <= K <= M*(M+1)/2.
Массив заполняется начиная со строчки K=1 по формуле A[K,M]=sum(A[K-M,r],r=1..M-1). Сумма элементов в строчке K=N будет искомым числом.

В решении, ссылку на которое вы дали, последовательно вычисляется число лестниц из j кубиков, нижний ряд которых не длиннее, чем i кубиков. Чтобы найти это число, надо к уже найденным лестницам, нижний ряд которых не длиннее, чем i-1 кубик (их мы оставляем без изменения), прибавить лестницы из j-i кубиков с нижним рядом не длиннее, чем i-1 кубик (к ним мы добавим ряд из i кубиков). Что и делается во внутреннем цикле.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы