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

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

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

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

»
12 лет назад, # |
Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

А разве не

dp[i][j] — кол-во подпоследовательностей с концом в i-й скобке и балансом j. Переберем номер следующей скобки (k) и сделаем dp[k][j+sign(k)] += dp[i][j] (sign(k) = -1 для ')' и 1 для '(')

UPD: ответ — сумма dp[i][0] по всем i. не переходим из состояний с отрицательным балансом

UPD2: не подумал про длинку.

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

    Тут нужны различные подпоследовательности. Причем, различные не по индексам, а по виду.

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

Вроде-бы динамика по позиции и балансу(разнице между количеством открывающихся и закрывающихся скобок). Переход — или пропускаем скобочку, или используем. При использовании — если скобочка открывающаяся — увеличиваем баланс, если закрывающаяся — уменьшаем(и следим чтобы баланс не стал отрицательным). Ответ нужно хранить в длинной арфиметике.

UPD Это неправильно, оказывается различными автор считает последовательности, отличающиеся формой, а не позицией в строке.

»
12 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится

Я писал динамику dp[i][j] — сколько способов дополнить скобочную последовательность с балансом j до правильной из суффикса i.. n-1. Переходов два: взять первую открывающуюся скобку или первую закрывающуюся скобку из суффикса. Нельзя допускать отрицательный баланс, потому что такие последовательности не исправить.

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

Апну тему, выше написано неверное решение, сейчас опишу решение, которое получает АС.

Заведем динамику (будем писать ее как рекурсию с запоминанимем) по двум параметрам — позиции и балансу (p,b). Перед этим преподсчитаем массив next[s.size()][2]. next[i][0] показывает позицию ближайшей к і открывающейся скобки(возможно, і). next[i][1] — тоже самое для закрывающейся. Тогда переходы в динамике таковы: 1) Переходим по открывающейся скобке в состояние next[p][0]+1, b+1. 2) Если позволяет баланс — переходим по закрывающейся скобке в состояние next[p][1]+1, b-1

Если текущий баланс равен 0 — к ответу нужно прибавить 1. Вот код, если вдруг не понятно