이것은 O(nlogn)해결책. 안O(n)Willard Zhan 이 지적한 솔루션 은이 답변의 마지막에 추가됩니다.
O(nlogn) 해결책
확신을 위해 f(i,j)=(h[j]−h[i])(j−i).
밝히다 l1=1, li 가장 작은 지수가되도록 li>li−1 과 h[li]<h[li−1]. 마찬가지로, 정의r1=n, ri 가장 큰 지수가 ri<ri−1 과 h[ri]>h[ri−1]. 시퀀스l1,l2,... 과 r1,r2,… 계산하기 쉽다 O(n) 시각.
없는 경우 i<j 그런 h[i]<h[j] (즉 f(i,j)>0)는 사소합니다. 우리는 이제 사소한 경우에 중점을 둡니다. 이러한 경우 솔루션을 찾으려면 해당 쌍만 고려하면됩니다.
각각 i<j 그런 h[i]<h[j], 허락하다 u 가장 큰 지수가 lu≤i, v 가장 작은 지수가되도록 rv≥j그런 다음 h[lu]≤h[i] (그렇지 않으면 lu+1≤i 의 정의에 의해 lu+1따라서 다음의 정의와 모순된다 u) 및 유사하게 h[rv]≥h[j]. 그 후
(h[rv]−h[lu])(rv−lu)≥(h[j]−h[i])(rv−lu)≥(h[j]−h[i])(j−i).
이것은 우리가 쌍만 고려하면된다는 것을 의미합니다
(lu,rv) 어디
lu<rv.
표시 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) 솔루션
하자 경우 . 증명은 또한 및 의 경우 이면 . 이것은 행렬 이 완전 모노톤 행렬 임을 의미합니다. 여기서 는 시퀀스 의 길이입니다 (그래서 은 끝에서 번째 요소를 의미합니다. ) 그런 다음 SMAWK 알고리즘 을 적용하여 최소값 을 찾아 최대 값 를 찾을 수 있습니다 .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