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

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

Добрый вечер!

Не могу решить задачу K с этого контеста. После прочтения разбора все равно не понял.

Условие:

Вася готовит N шашлыков. В каждом шашлыке qi кусочков. Вася тратит 1 секунду, чтобы наколоть 1 кусок мяса. Когда он заканчивает накалывать i-ый шашлык, он сразу же приступает к (i+1)-ому.

Вася часто мечтает. Каждая мечта занимает ровно 1 секунду и он забывает наколоть кусочек мяса в эту секунду. Вася не мечтает два раза в любые последовательные (t+1) секунды.

Из-за того, что он мечтает, некоторые шашлыки могут быть не полные. Однако гости не будут злиться, если i-ый шашлык имеет не менее xi кусочков.

Требуется посчитать, сколькими способами может Вася мечтать в течении его работы, чтобы все посетители были довольны. Ответ вывести по модулю 10^9+7.

Ограничения:

1 <= N <= 1000, 0 <= t <= 100, 1 <= qi <= 250, 0 <= xi <= qi

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

»
9 лет назад, # |
Rev. 4   Проголосовать: нравится +6 Проголосовать: не нравится

Пронумеруем все кусочки в сквозном порядке.

Я считал динамику d[n][k], где n — номер кусочка, который относится к шашлыку j, а k — количество забытых кусочков для шашлыка j. j легко рассчитывается по n.

Динамику разворачивал вперед. Из каждого состояния возможно всего 2 перехода: пусть next = n + t — следующий кусочек, который мы можем забыть, если забудем кусочек n.

Итак, если мы забываем текущий кусочек, делаем один из следующих переходов

  • если next принадлежит шашлыку j и k < q_i - x_i обновляем d[next][j+1]

  • если next не принадлежит шашлыку j обновляем d[next][1] — забудем один кусочек уже в другом шашлыке j' > j.

Переходы для незабывания тривиальны next = n + 1 :

  • если next принадлежит шашлыку j обновляем d[next][j]

  • если next не принадлежит шашлыку j обновляем d[next][0] — начинаем новый шашлык, в котором ещё ничего не забыли.

Осталось только аккуратно проинициализировать начальные состояния динамики. После решения думаю, что в данном случае удобнее было бы решать в обратную сторону.

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    спасибо, зашла такая динамика :)

    единственное что, next = i + t + 1 и k <= q_i - x_i

    и там, наверно опечатка: "если next принадлежит шашлыку j обновляем d[next][j]" должно быть обновляем d [next][k]