1. 程式人生 > >【填坑】DP·斜率優化&【hdu】3507

【填坑】DP·斜率優化&【hdu】3507

我們先給一個例子:
【hdu3507】給定n個正數與M(n∈[1,500000]),將它們分成若干段輸出。輸出一段的費用按下法計算:
c o s t = (

i = 1 k a i )
2
+ M cost=(\sum_{i=1}^{k}a_i)^2+M
求最小的 c o s
t cost

如果n小一些,這個題就應該屬於DP入門題的那一類了吧:
f [ i ] f[i] 為輸出前 i i 段的最小費用,則有:
f [ i ] = m i n { f [ j ] + w ( j + 1 , i ) 2 + M 1 j < i } , w ( i , j ) k = i j a k f[i]=min\{f[j]+w(j+1,i)^2+M|1≤j<i\},w(i,j)\sum_{k=i}^{j}a_k
時間複雜度為 O ( n 2 ) O(n^2) ,絕壁TLE!
自閉ing…TAT
自閉夠了,接著想辦法優化
觀察這個DP式(假設j為一個決策點,即要更新 f [ i ] f[i] 的點):
f [ i ] = f [ j ] + w ( j + 1 , i ) 2 + M f[i]=f[j]+w(j+1,i)^2+M
s u m [ i ] sum[i] 為前i項之和,則有:
f [ i ] = f [ j ] + ( s u m [ i ] s u m [ j ] ) 2 + M f[i]=f[j]+(sum[i]-sum[j])^2+M
假設還有另一決策點k:
f [ i ] = f [ k ] + ( s u m [ i ] s u m [ k ] ) 2 + M f[i]=f[k]+(sum[i]-sum[k])^2+M
它比j更優,則有:
f [ j ] + ( s u m [ i ] s u m [ j ] ) 2 + M > f [ k ] + ( s u m [ i ] s u m [ k ] ) 2 + M f[j]+(sum[i]-sum[j])^2+M>f[k]+(sum[i]-sum[k])^2+M
開啟括號,消去相同項:
f [ j ] 2 s u m [ i ] s u m [ j ] + s u m [ j ] 2 > f [ k ] 2 s u m [ i ] s u m [ k ] + s u m [ k ] 2 f[j]-2sum[i]sum[j]+sum[j]^2>f[k]-2sum[i]sum[k]+sum[k]^2
整理一下:
2 ( s u m [ k ] s u m [ j ] ) s u m [ i ] > ( s u m [ k ] 2 s u m [ j ] 2 ) + ( f [ k ] f [ j ] ) 2(sum[k]-sum[j])sum[i]>(sum[k]^2-sum[j]^2)+(f[k]-f[j])
Δ x = 2 ( s u m [ k ] s u m [ j ] ) , Δ y = ( s u m [ k ] 2 + f [ k ] ) ( s u m [ j ] 2 + f [ j ] ) \Delta x=2(sum[k]-sum[j]),\Delta y=(sum[k]^2+f[k])-(sum[j]^2+f[j]) 。因為 a i a_i 都是正數,所以 s u m [ i ] sum[i] 單增。
k > j k>j ,則:
s u m [ i ] > Δ y Δ x = k l sum[i]>\frac{\Delta y}{\Delta x}=k_l
等價於k比j優。
k < j k <j ,則:
s u m [ i ] < Δ y Δ x = k l sum[i]<\frac{\Delta y}{\Delta x}=k_l