前段時間看到csdn論壇的資料結構與演算法版上有人問了這麼乙個問題:
給定n個石子,其重量為a1,a2...,an,要求將其劃分為m堆,每乙份劃分的費用定義為這堆石頭中最大重量與最小重量的差的平方。總劃分費用等於各堆費用之和。 輸入:n m 及a1,a2...,an ,輸出:sum
我搜了一下,發現同樣的問題問過不止一遍:
這道題顯然用dp可以解決:
對所有石子的重量從小到大進行排序,設排序後的重量為a[1], a[2]....a[n]。
設f[n,m]為n個石子分成m堆後的最小費用,我們可以列出dp轉移方程:
f[j,m] = min_i (i設從i到j的石子的費用為w[i,j]=(a[j]-a[i])^2。對於這個w[i,j],可以驗證,當i<=i'<=j<=j'時,有w[i,j']+w[i',j]>=w[i,j]+w[i',j']。這就是四邊形不等式。有了這個性質,我們該如何用它來對dp進行優化呢?
我們看到每個f[i,m]的計算是根據f[x,m-1]的值進行運算的,我們可以把轉移方程看成對下面這個方程進行了m次操作:e[j]=min_i (i=t[i,j]」。我們看一下b陣列的意義:b[i]裡面存的是乙個界值,當我們把t[i,j]向右擴充套件的時候,只要j越過了這個界值,我們可以肯定的說,i一定比之前的所有i'都更優。
其次,有了b[i],我們發現,有些決策是沒用的。哪些呢?當i=b[j]的時候,i就是沒用的。為什麼?假設我現在在求e[k] (i=w[i,j]+w[i',j+1]。
根據此式,我們可以得出,t值也符合四邊形不等式,即
t[i,j+1]+t[i',j]>=t[i,j]+t[i',j+1]
把這個式子換個寫法:
t[i',j]-t[i,j]>=t[i',j+1]-t[i,j+1]
也就是說,當i再看看總的時間複雜度,我們發現對於e[j]=min_i (i 匆匆忙忙搞了一下四邊形優化,也就是做了幾道入門題而已 四邊形不等式詳解 反正我就記住這句話 判斷w是否為凸即判斷 w i,j 1 w i,j 的值隨著i的增加是否遞減 hdu 2829 include include include using namespace std define maxn 1... 一般適用於區間dp優化。對於dp i j dp i k d k j w i j 的dp方程,如果滿足w i j w i j w i j w i j i i j j 則w i j 是凸的,也就是說,對於dp i j 的決策s i j 必然滿足不等式s i j 1 s i j s i 1 j 所以求決策... 如果dp i j min dp i k dp k 1 j w i j 且滿足dp a c dp b d dp a d dp c d a那麼dp具有四邊形不等式性質 另外如果可以證明w i j 滿足單調性和四邊形不等式性質,那麼dp也具有四邊形不等式性質 單調性 w i j w i j 1 w i 1...四邊形優化
四邊形優化模板
dp四邊形優化