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

Автор begoon, 14 лет назад, По-русски
Подскажите начинающему: есть базовая динамика для задач про правильные скобочные последовательности (ПСП).

F(n, k) - количество ПСП длиной n и разницей между количеством открывающихся и закрывающихся скобок (глубиной) k:

F(n, k) = F(n-1, k-1) + F(n-1, k+1).

Многие задачи про скобки к ней сводятся. Но есть такой вариант, когда надо найти количество правильных скобочных последовательностей из n открывающихся скобок, причем максимальная глубина на всей строке (разница между открывающимися и закрывающимися скобками) должна быть равна k. Например, для n=3 и k=2 последовательность ()(()) верная (глубина 2), а ((())) нет (глубина 3).

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

Спасибо.
  • Проголосовать: нравится
  • 0
  • Проголосовать: не нравится

14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
f (ровно k) = f (не больше k) - f (не больше k - 1).

А уже f (не больше k) найти не сложнее, чем в исходной задаче без ограничений.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    У меня выходит, что тут нужно вот такое состояние:

    f(n, k, t) - количество ПСП длиной n, глубиной k, и флаг t = 0, если нужная глубина еще не достигнута, и t = 1, если достигнута. Не подскажите, какие тут переходы?
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Ну можно и так.

      Будут переходы назад такие:
      для k < K: f (n, k, t) = f (n - 1, k - 1, t) + f  (n - 1, k + 1, t).
      для k = K: f (n, K, 1) = f (n - 1, K - 1, 0) + f (n - 1, K - 1, 1),
      f (n, K, 0) = 0.

      Переходы строятся механически. Пусть мы в состоянии (n, k, t). Попасть в него можно не более чем четырьмя способами: отрежем последний символ (два случая) и рассмотрим флаг (x два случая). Каждый случай либо есть как слагаемое, либо нет.

      Кстати, g (a, b), a <= b - количество способов построить начало из a открывающих и b закрывающих скобок - часто удобнее на практике: как минимум, тратится в два раза меньше памяти.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Посмотрите на wiki как аналитически выводится формула для чисел Каталана через принцип отражения. Тут то же самое.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Сначала напишем рекурсивное ПП , а потом понимаем , что у нас нету левых массивов , и можно запоминание сделать. Ну то есть , если мы уже были в таком положении , то еще раз не считать.
Параметры будут такие: n,max,k. Где n - текущая длина , которую мы уже выстроили max - максимальная из встречающихся нам глубин, что уже есть k - текущая глубина. Писать можно рекурсивно, только не забудь что у нас при некоторых даже не очень больших значениях примерно 100 , уже нужно писать длинную арифметику.