Đây là một giải pháp . Một giải pháp O ( n ) được chỉ ra bởi Willard Zhan được thêm vào cuối câu trả lời này.O(nlogn)O(n)
Giải pháp O ( n log n )O(nlogn)
Đối với sự kiên nhẫn, biểu thị .f(i,j)=(h[j]−h[i])(j−i)
Xác định và l i là chỉ số nhỏ nhất sao cho l i > l i - 1 và h [ l i ] < h [ l i - 1 ] . Tương tự, xác định r 1 = n và r i là chỉ số lớn nhất sao cho r i < r i - 1 và h [ r i ] >l1=1lili>li−1h[li]<h[li−1]r1=nriri<ri−1 . Các trình tự l 1 , l 2 , . . . và r 1 , r 2 , ... rất dễ tính toán trong O ( n ) thời gian.h[ri]>h[ri−1]l1,l2,...r1,r2,…O(n)
Trường hợp không có sao cho h [ i ] < h [ j ] (tức là f ( i , j ) > 0 ) là tầm thường. Bây giờ chúng tôi tập trung vào các trường hợp không tầm thường. Trong những trường hợp như vậy, để tìm ra giải pháp, chúng ta chỉ cần xem xét các cặp như vậy.i<jh[i]<h[j]f(i,j)>0
Đối với mỗi mà h [ i ] < h [ j ] , chúng ta hãy u có chỉ số lớn nhất sao cho l u ≤ i , và v là chỉ số nhỏ nhất mà r v ≥ j , sau đó h [ l u ] ≤ h [ i ] (nếu không l u + 1 ≤ i theo định nghĩa của l u + 1i<jh[i]<h[j]ulu≤ivrv≥jh[lu]≤h[i]lu+1≤ilu+1, Do đó mâu thuẫn với định nghĩa của ), và tương tự h [ r v ] ≥ h [ j ] . Do đó
( h [ r v ] - h [ l u ] ) ( r v - l u ) ≥ ( h [ j ] - h [ i ] ) ( r v - l u ) ≥ ( h [uh[rv]≥h[j]
Điều này có nghĩa là chúng ta chỉ cần xem xét các cặp ( l u , r v ) trong đó 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
Suy ra , chúng ta có bổ đề sau.v(u)=argmaxv: lu<rvf(lu,rv)
(lu,rv)lu<rvu0u<u0v<v(u0)u>u0v>v(u0)
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.
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,
(h[rv(u0)]−h[lu])(rv(u0)−lu)>(h[rv]−h[lu])(rv−lu).
(lu,rv(u0))(lu,rv)■
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)
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