POJ2373動態規劃

2021-05-23 19:40:00 字數 692 閱讀 9260

單調佇列優化的dp。首先我們先進行預處理,將可以合併的區間合併到一起,這個可以在o(nlogn)的時間內完成。方法是按照x排序,然後找相鄰的兩個區間(a,b)和(c,d)是否滿足ac,注意這裡必須嚴格大於才行,因為這裡的區間都是開區間,如果存在b==c這樣的情況,那麼b這個點就可以分割。

然後進行動態規劃轉移,令dp[i]為前i個區間可以劃分的最小區間數目,那麼就有:

dp[i]=min+1,  a<=k<=b,如果不存在這樣的k值,或者i是在某個區間內,那麼dp[i]就為oo,注意初始化dp[0]=1, dp[1]=oo。

運用類似多重揹包的方法將i劃分成2的乙個剩餘類,也就是說我們可以對上式進行變形,變成如下的形式:

dp[mod+2*j]=min+1, a<=j-k<=b,這裡dp[mod+2*j]是個僅關於j的函式,可以用單調佇列維護一定區間的最值,最後問題得到解決。

注意這題的一些細節,首先當l為奇數的時候dp[l]與dp[1]屬於同乙個剩餘類,那麼dp[l]就為oo,所以直接可以輸出-1。其次,對於判斷i是否在區間內,可以用乙個指標p動態向後移動的方式來判斷,如果第p個區間的右邊界小等於i,那麼p就右移,知道p等於n或者右邊界大於i為止,這時候判斷第p個區間的左邊界是否比i小,如果左邊界小於i,那麼dp[i]就是oo。最後,如果dp[l]等於oo記得輸出-1。

這裡還有乙個很好的技巧,在佇列中加乙個哨兵oo,它的id也為oo,這樣可以處理如果i我的**:

灌溉草場POJ2373

灌溉草場poj2373 偽 思路 具體分析根據老師動歸課件,這裡給出ac原始碼用f x 表示到x時最小水管數。if isodd x f x inf if x 2a f x infif inarea x f x inf if x 2a x 2b inarea x f x 1 if x 2b f x m...

POJ2373 單調佇列優化DP

這道題調了我一天.呃.開始很多地方沒注意.傳說中樓教主的男人八題搞定一道.這道題是一道典型的dp題.但直接做時死超的.所以要用單調佇列來優化.關於最基礎的單調佇列.我前一篇文章已經說了.所以直接分析本題.題意是說有乙個直線的山脊.噴泉是乙個在中間向兩邊同時噴的.最近噴a.最遠b.同時山脊上有牛.每只...

POJ 2373 單調佇列優化DP

題意 思路 f i min f j 1 2 i j 2 i表示當前在第i個點。f i 表示當前最少的線段個數 先是n 2的樸素dp 果斷tle by siriusren include include include using namespace std int n,l,a,b,tot 1,xx,...