前天學長拉了個區間dp的專題,花了兩個做,今天就來做個總結吧!!!
區間dp,顧名思義,在區間上dp,大多數題目的狀態都是由區間(類似於dp[l][r]這種形式)構成的,就是我們可以把大區間轉化成小區間來處理,然後對小區間處理後再回溯的求出大區間的值,主要的方法有兩種,記憶化搜尋和遞推。
在用遞推來求解時,關鍵在於遞推是for迴圈裡面的順序,以及dp的關鍵:狀態轉移方程。
當然大部分的區間dp都是有特點的,我們可以考慮符合什麼條件下,大區間可以轉化成小區間,然後找出邊界條件,進行dp求解。
區間dp也有很經典的板子部分,下面丟擲**和解析:
memset(dp,0,sizeof(dp))//初始dp陣列
for(int len=2;len<=n;len++)
}
當然dp陣列的維度和邊界條件以及轉移方程都是可變的,但是很多簡單題都是這樣可以做出來的,難題也都是情況更複雜了些,其最基本的思想還是不變的。
區間dp大部分的題目還有一種優化,因為我們很容易知道正常的區間dp時間複雜度為o(n^3)的,對於有的n是1000的,會超時
這時候就要用到乙個經典的優化可以把它優化到:o(n^2),其實證明很難理解,但是大部分題都不會卡,因為dp已經很難了。
就算需要四邊形優化,也就是多開乙個陣列s的事,在列舉最優分割點時,再縮小一下列舉範圍,經典的用空間換時間的做法。
下面丟擲基於四邊形優化的**。
for(int len=2;len<=n;len++)
} }
}
區間dp的知識點其實不多,最重要的還是在狀態轉移方程這一塊,當然這裡也有一些經典而且有意思的題目給大家。
先給出一些經典區間dp題型:石子合併,環型石子匹配,括號匹配問題,括號匹配變形,整數劃分,最優三角形剖分,最優矩陣鏈乘。(最後兩個題型在最後給出鏈結,kuangbin帶你飛專題裡面有)
然後就可以做一下比較有意思的題目,比如kuangbin帶你飛區間dp專題,當然還有其他經典題型,以後再補。
kuangbin帶你飛區間dp專題
zoj3537——最優三角剖分+凸包
題解poj2955——括號匹配+區間dp經典題
題解codeforce-149d——括號匹配染色+區間dp
題解poj1651——最優矩陣鏈乘
題解zoj3469——區間dp好題
題解hdu4283——經典區間dp
題解lightoj1422——區間dp經典題
題解hdu2476——經典區間dp
題解
區間DP入門
區間dp,看名字其實會聯想到劃分dp,其實兩者的關係並不大。劃分dp是從頭到尾劃分解決,並且有劃分數量,而區間dp沒有這些限制條件,可以從任意區間開始,一直擴大到整個區間。不斷遞推求解。同樣也是分兩步去做。首先 還是進行資料處理,比如用陣列sum i j 去儲存i到j的和,或者是用別的方式處理並儲存...
區間DP入門
今天學長給我們講了區間dp,當然聽得雲裡霧裡,講完之後基本處於自閉狀態,然後還是自己到大佬的部落格,然後看部落格,但是並沒有找到很詳細的部落格,所以我想自己寫一寫,大神們勿噴哈.一 定義 區間dp,顧名思義是在區間上dp,它的主要思想就是先在小區間進行dp得到最優解,然後再利用小區間的最優解合併求大...
區間dp入門
區間dp就是區間上的dp,先算出小區間的最優解,再由小區間合併推出大區間的最優解。include include include includeusing namespace std const int inf 0x3f3f3f3f const int maxn 1010 int n int a m...