Ini adalah solusi . Sebuah solusi ditunjukkan oleh Willard Zhan ditambahkan pada akhir jawaban ini.O ( n )O(nlogn)O(n)
O(nlogn) solusi
Untuk kenyamanan, tunjukkan .f(i,j)=(h[j]−h[i])(j−i)
Tentukan , dan menjadi indeks terkecil sehingga dan . Demikian pula, definisikan , dan menjadi indeks terbesar sehingga dan . Urutan dan mudah untuk dihitung dalam waktu .l i l i > l i - 1 h [ l i ] < h [ l i - 1 ] r 1 = n r i r i < r i - 1 h [ r i ] > h [ r i - 1 ] l 1 , l 2 , . . .l1=1lili>li−1h[li]<h[li−1]r1=nriri<ri−1h[ri]>h[ri−1]l1,l2,...r1,r2,…O(n)
Kasus di mana tidak ada sehingga (yaitu ) adalah sepele. Kami sekarang fokus pada kasus-kasus non-sepele. Dalam kasus seperti itu, untuk menemukan solusinya, kita hanya perlu mempertimbangkan pasangan semacam itu.h [ i ] < h [ j ] f ( i , j ) > 0i<jh[i]<h[j]f(i,j)>0
Untuk setiap sehingga h [ i ] < h [ j ] , biarkan kamu menjadi indeks terbesar sehingga l u ≤ i , dan v menjadi indeks terkecil sehingga r v ≥ j , lalu h [ l u ] ≤ h [ i ] (jika tidak l u + 1 ≤ i oleh definisi l u + 1i<jh[i]<h[j]ulu≤ivrv≥jh[lu]≤h[i]lu+1≤ilu+1, dengan demikian bertentangan dengan definisi ), dan juga h [ r v ] ≥ h [ j ] . Oleh karena itu
( h [ r v ] - h [ l u ] ) ( r v - l u ) ≥ ( h [ j ] - h [ i ] ) ( r v - l u ) ≥ ( h [uh[rv]≥h[j]
Ini berarti kita hanya perlu mempertimbangkan pasangan ( l u , r v ) di mana 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
Nyatakan , kita memiliki lemma berikut.v(u)=argmaxv: lu<rvf(lu,rv)
Sepasang mana l u < r v , dan di mana ada u 0 sehingga u < u 0 dan v < v ( u 0 ) atau sedemikian sehingga u > u 0 dan v > v ( u 0 ) , tidak bisa menjadi solusi optimal akhir.(lu,rv)lu<rvu0u<u0v<v(u0)u>u0v>v(u0)
Bukti. Menurut definisi , kita memiliki
( 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)
atau
(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.
Dalam kasus di mana dan v < v ( u 0 ) , catat h [ r v ] - h [ r v ( u 0 ) ] < 0 dan r v - r v ( u 0 ) > 0 , dan juga l u < l u 0 dan h [ l u ] > hkamu < kamu0v < v ( u0)h [ rv] - h [ rv ( kamu0)] < 0rv- rv ( kamu0)> 0lkamu< lkamu0 , kita memiliki
h [ lkamu] > h [ lkamu0]
> ( h [ rv] - h [ rv ( kamu0)] ) lkamu+ h [ lkamu] ( rv- rv ( kamu0))( h [ rv] - h [ rv ( kamu0)] ) lkamu0+ h [ lkamu0] ( rv- rv ( kamu0)) .
Ini berarti
atau
(h[ r v ( u 0 ) ]-h[ l u ])( r v ( u 0 ) - l u )>(h[ r v ]-h[ l u ])( r v - l u ).
( h [ rv] - h [ rv ( kamu0)] ) lkamu+ h [ lkamu] ( rv- rv ( kamu0)) + h [ rv ( kamu0)] rv ( kamu0)- h [ rv] rv ( kamu0)> 0 ,
( h [ rv ( kamu0)] - h [ lkamu] ) ( rv ( kamu0)- akukamu) > ( h [ rv] - h [ lkamu] ) ( rv- akukamu) .
( lkamu, rv ( kamu0))( lkamu, rv)■
v ( ℓ / 2 )ℓl1, aku2, ...Hai1( lkamu, rv)u = 1 , ... , ℓ / 2 - 1v = v ( ℓ / 2 ) , v ( ℓ / 2 ) + 1 , …Hai2( lkamu, 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