Il s'agit d'une solution . Une solution O ( n ) signalée par Willard Zhan est annexée à la fin de cette réponse.O(nlogn)O(n)
Solution O ( n log n )O(nlogn)
Pour la convience, notons .f(i,j)=(h[j]−h[i])(j−i)
Définissez , et l i est le plus petit indice tel que l i > l i - 1 et h [ l i ] < h [ l i - 1 ] . De même, définissez r 1 = n , et r i est le plus grand indice tel que r i < r i - 1 et h [ r i ] >l1=1lili>li−1h[li]<h[li−1]r1=nriri<ri−1 . Les séquences de l 1 , l 2 , . . . et r 1 , r 2 , … sont faciles à calculer en temps O ( n ) .h[ri]>h[ri−1]l1,l2,...r1, r2, …O ( n )
Le cas où il n'y a pas de tel que h [ i ] < h [ j ] (ie f ( i , j ) > 0 ) est trivial. Nous nous concentrons maintenant sur les cas non triviaux. Dans de tels cas, pour trouver la solution, il suffit de considérer de telles paires.i < jh [ i ] < h [ j ]F( i , j ) > 0
Pour chaque tel que h [ i ] < h [ j ] , soit u le plus grand indice tel que l u ≤ i , et v le plus petit indice tel que r v ≥ j , alors h [ l u ] ≤ h [ i ] (sinon l u + 1 ≤ i par définition de l u + 1i < jh [ i ] < h [ j ]ulu≤ ivrv≥ jh [ lu] ≤ h [ i ]lu + 1≤ ilu + 1, contredit donc la définition de ), et de même h [ r v ] ≥ h [ j ] . Donc
( h [ r v ] - h [ l u ] ) ( r v - l u ) ≥ ( h [ j ] - h [ i ] ) ( r v - l u ) ≥ ( h [uh [ rv] ≥ h [ j ]
Cela signifie que nous devons seulement considérer les paires ( l u , r v ) où l u < r v .
( h [ rv] - h [ lu] ) ( rv- lu) ≥ ( h [ j ] - h [ i ] ) ( rv- lu)≥(h[j]−h[i])(j−i).
(lu,rv)lu< rv
Notons , nous avons le lemme suivant.v ( u ) = argmaxv : l u< rvF( lu, rv)
Une paire où l u < r v , et où il existe u 0 tel que u < u 0 et v < v ( u 0 ) ou tel que u > u 0 et v > v ( u 0 ) , ne peut être une solution optimale finale.( lu, rv)lu< rvu0u < u0v < v ( u0)u > u0v > v ( u0)
Preuve. Selon la définition de , nous avons
( h [ r v ( u 0 ) ] - h [ l u 0 ] ) ( r v ( u 0 ) - l u 0 ) ≥ ( h [ r v ] - h [ l u 0 ] ) ( r v - lv ( u0)
ou
(h[rv]-h[r v ( u 0 ) ])l u 0 +h[l u 0 ](rv-r v ( u 0 ) )+h[r v ( u 0 ) ]r v ( u 0 ) -
( 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.
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)) .
( h [ rv] - h [ rv ( u0)] ) lu+ h [ lu] ( rv- rv ( u0)) + h [ rv ( u0)] rv ( u0)- h [ rv] rv ( u0)> 0 ,
ou
( h [ rv ( u0)] - h [ lu] ) ( rv ( u0)- lu) > ( h [ rv] - h [ lu] ) ( rv- lu) .
Donc ( lu, rv ( u0)) est une solution strictement meilleure que ( lu, rv). La preuve pour l'autre cas est similaire.■
Nous pouvons calculer v ( ℓ / 2 ) tout d'abord où ℓ est la longueur de la séquence l1, l2, …, puis calculez récursivement la solution optimaleo1 parmi ( lu, rv)c'est pour u = 1 , … , ℓ / 2 - 1 et v = v ( ℓ / 2 ) , v ( ℓ / 2 ) + 1 , …, et la solution optimale o2 parmi ( lu, rv)c'est pour u = ℓ / 2 + 1 , ℓ / 2 + 2 , … et v = 1 , … , v ( ℓ / 2 ). En raison du lemme, la solution optimale globale doit provenir de{ ( lℓ / 2, rv ( ℓ / 2 )) , o1, o2}.
O ( n ) Solution
Laisser F( lu, rv) = - ∞ si lu≥ rv. La preuve du lemme montre également une propriété importante: pouru > u0 et v > v0, si F( lu0, rv0) ≥ f( lu0, rv), puis F( lu, rv0) > f( lu, rv). Cela signifie que la matriceM[ x , y] : = - f( lX, rc - y+ 1) est une matrice totalement monotone où c est la longueur de la séquence r1, r2, … (donc rc - y+ 1 signifie le y-th élément de la fin), l' algorithme SMAWK peut alors appliquer pour trouver la valeur minimale deM, donc la valeur maximale de F.