Я пытаюсь решить вариант проблема, которую я задавал ранее:
Имея строку скобок (длиной ‹= 1 000 000) и список запросов диапазона, найдите самую длинную подпоследовательность сбалансированных скобок в каждом из диапазонов для каждого из ‹= 100 000 запросов.
Я нашел этот другой вопрос SO, который похож, но имеет только O (N^3) алгоритм.
Я считаю, что решение DP в форме dp[i, j] = longest balanced subsequence in [i .. j]
должно работать, потому что после вычисления это позволит ответить на все запросы диапазона, просто запросив таблицу DP. Однако даже решение этой проблемы за O(N^2) превысило бы ограничения по времени из-за большой возможной длины входной строки.
Кроме того, трюк с использованием стека для отслеживания соответствия скобок больше не работает напрямую, потому что вы ищете подпоследовательности, а не подстроки.
У меня есть метод, который, я думаю, может работать, но не уверен:
Длина самой длинной подпоследовательности сбалансированных скобок в интервале равна сумме длин самых длинных непересекающихся подстрок сбалансированных скобок в этом интервале.
Например, если у вас есть строка
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
) ) ( ( ) ( ( ) ) ) ) ( ( ) )
Длина самой длинной подпоследовательности сбалансированных скобок в интервале [0, 8] (включительно) равна 5. Эта длина равна сумме длин самых длинных непересекающихся подстрок в интервале: "()" + "( ( ) )".
Будет ли этот метод всегда работать, или есть лучший способ?
O(n)
ответ. Но я не разрушу любой конкурс, от которого вы его получили, отдав его вам. - person btilly   schedule 30.10.2014100000
запросов предназначен для полного диапазона длины1000000
, который недостаточно оптимизирован. Должен быть способ, чтобы каждый запрос был log(N) или лучше... - person 1110101001   schedule 30.10.2014