三分法(Ternary Search)求解凸(凹)函數的極值問題

二分法作爲分治中最常見的方法,在各種比賽中經常出現(如:POJ 1434),但只適用於單調函數,若遇到凸(凹)函數求解極值,可採取三分的方法求解。凸(凹)函數在高數中的定義是:若函數的二階導數在區間上恆大於0,則該函數在區間爲凸函數;反之,小於0爲凹函數。在比賽中面對一個問題而推出的求解函數f,求解其二階導數不是那麼容易。爲了提高出題效率,可以根據題目所求做出大膽的假設:即若求最大值,則可假設函數爲凸的;若求最小值,則可假設函數爲凹的(當然求最短路等圖論問題除外),具體的三分方法如圖:

凸函數:


凹函數:


核心程序段(求解凸函數)如下:

while(r-l>esp){ 

     double mid=(l+r)/2.0; 

     double midmid=(mid+r)/2.0;

           if(f(mid)-f(midmid)>esp)r=midmid; 

           else l=mid; 

 }

求解極小值則只需要換成if(f(midmid)-f(mid)>esp)即可

比較不錯的題目有:

PKU3301   HDU2438   ZJU3203   Ural1874  LightOJ11461240 CodeForces185B

轉載請註明出處:http://blog.csdn.net/rabia/article/details/7826144

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章