To jest O(nlogn)rozwiązanie. NaO(n)rozwiązanie wskazane przez Willarda Zhana jest dołączone na końcu tej odpowiedzi.
O(nlogn) rozwiązanie
Oznacz dla wygody f(i,j)=(h[j]−h[i])(j−i).
Definiować l1=1, i li być najmniejszym indeksem takim, że li>li−1 i h[li]<h[li−1]. Podobnie zdefiniujr1=n, i ri być największym indeksem takim, że ri<ri−1 i h[ri]>h[ri−1]. Sekwencjel1,l2,... i r1,r2,… są łatwe do obliczenia O(n) czas.
Przypadek, w którym nie ma i<j takie, że h[i]<h[j] (to znaczy f(i,j)>0) jest banalna. Skupiamy się teraz na sprawach niebanalnych. W takich przypadkach, aby znaleźć rozwiązanie, musimy wziąć pod uwagę tylko takie pary.
Dla każdego i<j takie, że h[i]<h[j], pozwolić u być największym indeksem takim, że lu≤i, i v być najmniejszym indeksem takim, że rv≥j, następnie h[lu]≤h[i] (Inaczej lu+1≤i z definicji lu+1, jest zatem sprzeczne z definicją u) i podobnie h[rv]≥h[j]. W związku z tym
(h[rv]−h[lu])(rv−lu)≥(h[j]−h[i])(rv−lu)≥(h[j]−h[i])(j−i).
Oznacza to, że musimy brać pod uwagę tylko pary
(lu,rv) gdzie
lu<rv.
Oznaczać v(u)=argmaxv: lu<rvf(lu,rv)mamy następujący lemat.
Para gdzie i gdzie istnieje tak że i lub takie, że i , nie może być ostatecznym optymalnym rozwiązaniem.(lu,rv)lu<rvu0u<u0v<v(u0)u>u0v>v(u0)
Dowód. Zgodnie z definicjąmamy
lub
v(u0)
(h[rv(u0)]−h[lu0])(rv(u0)−lu0)≥(h[rv]−h[lu0])(rv−lu0),
(h[rv]−h[rv(u0)])lu0+h[lu0](rv−rv(u0))+h[rv(u0)]rv(u0)−h[rv]rv(u0)≥0.
W przypadku, gdy i , zanotuj i , a także i mamy
u<u0v<v(u0)h[rv]−h[rv(u0)]<0rv−rv(u0)>0lu<lu0h[lu]>h[lu0]
> (h[rv]−h[rv(u0)])lu+h[lu](rv−rv(u0))(h[rv]−h[rv(u0)])lu0+h[lu0](rv−rv(u0)).
Oznacza to
lub
(h[rv]−h[rv(u0)])lu+h[lu](rv−rv(u0))+h[rv(u0)]rv(u0)−h[rv]rv(u0)>0,
(h[rv(u0)]−h[lu])(rv(u0)−lu)>(h[rv]−h[lu])(rv−lu).
Tak więc jest zdecydowanie lepszym rozwiązaniem niż . Dowód dla drugiego przypadku jest podobny. (lu,rv(u0))(lu,rv)■
Możemy najpierw obliczyć gdzie jest długością sekwencji , a następnie rekurencyjnie obliczyć optymalne rozwiązanie spośród dla i i optymalne rozwiązanie spośród dla i . Ze względu na lemat globalne optymalne rozwiązanie musi pochodzić z .v(ℓ/2)ℓl1,l2,…o1(lu,rv)u=1,…,ℓ/2−1v=v(ℓ/2),v(ℓ/2)+1,…o2(lu,rv)u=ℓ/2+1,ℓ/2+2,…v=1,…,v(ℓ/2){(lℓ/2,rv(ℓ/2)),o1,o2}
O(n) Rozwiązanie
Niech jeśli . Dowód lematu pokazuje również ważną właściwość: dla i , jeśli , to . Oznacza to, że macierz to macierz całkowicie monotoniczna, gdzie jest długością sekwencji (więc oznacza -ty element od końca), następnie algorytm SMAWK może zastosować, aby znaleźć minimalną wartość , a więc maksymalną wartość .f(lu,rv)=−∞lu≥rvu>u0v>v0f(lu0,rv0)≥f(lu0,rv)f(lu,rv0)>f(lu,rv)M[x,y]:=−f(lx,rc−y+1)cr1,r2,…rc−y+1yMf