Тем не менее, мы используем f[i]
обозначает максимальное значение, которое мы можем получить, заканчивая последовательность с E[i]
.
Итак, обычно у нас есть for (int i = 1;i <= n;i++) f[i] = dp(i);
и первоначально f[0] = 0;
и E[0] = -INF;
Теперь мы вычислим f[i]
в dp(i)
в пределах O(log(N))
.
в dp(i)
, мы найдем максимум f[j]
с E[j] < E[i]
для всех 0 <= j < i
.Здесь мы можем поддерживать Segment Tree
.
То есть dp(i) = find_max(1,E[i]-1) + W[i]
(это занимает O(log)
), а для каждого уже вычисленного f [i] update(E[i],f[i])
.
Таким образом, весь алгоритм занимает (O(NlogN))
.
Совет. Если E[i]
изменяется в очень большом диапазоне, это может быть Discretization
ed.