Собственно задача. Понимаю, что задача, наверное, дикий боян, но никак не пойму как решать. Расскажите, кто знает.
№ | Пользователь | Рейтинг |
---|---|---|
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 | 156 |
8 | TheScrasse | 154 |
9 | Dominater069 | 153 |
9 | nor | 153 |
Название |
---|
А разве не
dp[i][j] — кол-во подпоследовательностей с концом в i-й скобке и балансом j. Переберем номер следующей скобки (k) и сделаем dp[k][j+sign(k)] += dp[i][j] (sign(k) = -1 для ')' и 1 для '(')
UPD: ответ — сумма dp[i][0] по всем i. не переходим из состояний с отрицательным балансом
UPD2: не подумал про длинку.
Тут нужны различные подпоследовательности. Причем, различные не по индексам, а по виду.
Вроде-бы динамика по позиции и балансу(разнице между количеством открывающихся и закрывающихся скобок). Переход — или пропускаем скобочку, или используем. При использовании — если скобочка открывающаяся — увеличиваем баланс, если закрывающаяся — уменьшаем(и следим чтобы баланс не стал отрицательным). Ответ нужно хранить в длинной арфиметике.
UPD Это неправильно, оказывается различными автор считает последовательности, отличающиеся формой, а не позицией в строке.
Я писал динамику dp[i][j] — сколько способов дополнить скобочную последовательность с балансом j до правильной из суффикса i.. n-1. Переходов два: взять первую открывающуюся скобку или первую закрывающуюся скобку из суффикса. Нельзя допускать отрицательный баланс, потому что такие последовательности не исправить.
Апну тему, выше написано неверное решение, сейчас опишу решение, которое получает АС.
Заведем динамику (будем писать ее как рекурсию с запоминанимем) по двум параметрам — позиции и балансу (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. Вот код, если вдруг не понятно
Круто, а разве решение knightL не тоже самое делает?
Я в него только-что вник, и вправду тоже самое.