Изменения

Перейти к: навигация, поиск

Правильные скобочные последовательности

21 байт убрано, 21:53, 16 декабря 2012
Нет описания правки
next(s):
pointer_close counter_close = 0 pointer_open counter_open = 0
for (i = length(s); i > 0; i--)
if (s[i] == '('):
pointer_opencounter_open++ if (pointer_close counter_close > pointer_opencounter_open)
break
else
pointer_closecounter_close++ delete(s, length(s) - pointer_open counter_open - pointer_close counter_close + 1, pointer_close counter_close + l)
if (s == ""):
return false
s = s +')'
for (j = 1; j <= pointer_opencounter_open; j++):
s = s + '('
for (j = 1; j < pointer_closecounter_close; j++):
s = s + ')'
return true
return num
Пусть теперь разрешены скобки нескольких $k$ типов. Тогда при рассмотрении текущего символа $s[i]$ до пересчёта $\rm depth$ мы должны перебирать все скобки, которые меньше текущего символа в установленном ранее порядке, пробовать ставить эту скобку в текущую позицию (получая тем самым новый баланс $\rm ndepth = \rm depth \pm 1$), и прибавлять к ответу количество соответствующих "хвостов" - завершений (которые имеют длину $2n - i - 1$, баланс $\rm ndepth$ и $k$ типов скобок). Утверждается, что формула для этого количества имеет вид:
$d[2n - i - 1][ndepth] \cdot k^{(2n - i - 1 - ndepth) / 2}$
Анонимный участник

Навигация