Динамическое программирование количества подпоследовательностей со свойством?

Рассмотрим задачу динамического программирования, которая спрашивает, сколько различных подпоследовательностей (не обязательно смежных )последовательности S обладают определенным свойством P со значением p0.

Диапазон P невелик и конечен, и существует эффективный способ вычисления P:

P(s1 + s2) = f(P(s1), P(s2))

где +обозначает конкатенацию последовательностей.

Один из способов сделать это — подсчитать, сколько существует подпоследовательностей префикса S[1] + S[2] +... + S[k]последовательности S, обладающих свойством px. (Сохранить вCount[px][k])

Итак, рекурсия:

Count[px][k] = Count[px][k-1] // not using element S[k];

P pq = f(px,P(S[k])); // calculate property pq of appending element S[k]
Count[pq][k] += Count[px][k-1] // add count of P(prefix+S[k])

и тогда ответ:

return Count[p0][S.length]

Это работает, когда элементы S попарно различны, однако он будет учитывать дважды подпоследовательности, которые имеют одинаковое значение, но используют разные элементы в разных позициях.

Как изменить этот алгоритм, чтобы он считал одинаковые подпоследовательности ровно один раз? (т.е. считает только различные подпоследовательности)

6
задан Andrew Tomazos 1 August 2012 в 13:45
поделиться