Это довольно простое решение для динамического программирования.
Для каждого индекса i , рассчитать:
- Длина последовательности 1 с, которая непосредственно предшествует ей, если ничего не было удалено;
- Самая длинная последовательность из 1, которая может непосредственно предшествовать ей, если перед ней будет удалена ровно одна подстрока; и
- Самая длинная последовательность из 1, которая может непосредственно предшествовать ей, если перед ней будет удалено ровно две подстроки.
Для каждого индекса эти три значения легко вычисляются в постоянное время из значений для более ранних индексов, поэтому вы можете сделать это за один проход за O (N) время.
Например, пусть BEST (i, r) будет лучшей длиной, непосредственно предшествующей позиции i после удаления r подстрок. Если i> = K , то вы можете удалить подстроку, заканчивающуюся на i и имеющую BEST (i, r) = BEST (iK, r-1) для r> 0 . Если string [i-1] = '1' , вы можете расширить последовательность с предыдущей позиции и получить BEST (i, r) = BEST (i-1, r) + 1 . Выберите наилучшую возможность для каждого i, r .
Самое большое значение, которое вы найдете на шаге (3) - это ответ.