Входы:
N, the number of chars in a string
e[0..N-1]: (b,c) an element of set e[a] means [a,b) is a substring with score c.
(Если возможны все подстроки, то у вас может быть только c (a, b).)
Например, [1,2) мы имеем в виду подстроку, охватывающую 2-ю букву строки (полуоткрытый интервал).
(пустые подстроки не разрешены; если бы они были, то вы могли бы обрабатывать их должным образом только в том случае, если вы позволяете их "брать" не более k раз)
Выходы:
s[i] is the score of the best substring covering of [0,i)
a[i]: [a[i],i) is the last substring used to cover [0,i); else NULL
Алгоритм - O (N ^ 2), если интервалы e не редки; O (N + E) где e - общее количество разрешенных интервалов. Это эффективно находит лучший путь через ациклический граф:
for i = 0 to N:
a[i] <- NULL
s[i] <- 0
a[0] <- 0
for i = 0 to N-1
if a[i] != NULL
for (b,c) in e[i]:
sib <- s[i]+c
if sib>s[b]:
a[b] <- i
s[b] <- sib
Чтобы получить наилучшие тройки покрытия (a, b, c), где стоимость [a, b) равна c:
i <- N
if (a[i]==NULL):
error "no covering"
while (a[i]!=0):
from <- a[i]
yield (from,i,s[i]-s[from]
i <- from
Конечно, вы можете сохранить пару (sib, c) в s [b] и сохранить вычитание.