單調佇列優化DP 圍欄

2021-10-08 05:50:41 字數 817 閱讀 8153

這道題只有兩種狀態,乙個是工人,乙個是磚,那麼我們就可以定義我們的函式f[i

][j]

f[i][j]

f[i][j

]代表的是到第i個工人刷到j塊磚所花費的代價。

定義完狀態過後我們開始劃分集合,第一種就是第i個工人不刷那麼就是f[i

−1][

j]

f[i-1][j]

f[i−1]

[j],然後就是第i個工人刷,刷的話又分不刷第j塊磚,就是f[i

][j−

1]

f[i][j-1]

f[i][j

−1],然後就是刷第j塊磚,因為這道題是連續刷,那麼也就是刷到第j塊磚。我們可以從[1,j]…[j,j]這樣的區間來刷磚。我們假設從第k+1塊磚開始刷獲得的代價是最大的。因為我們刷磚的起點是小於s點的,所以我們只需要維護乙個滑動視窗,這個視窗包含s的時候的我們找出前面代價的最大點也就是k點。再加上後面連續磚所花費的代價。然後就是滑動視窗的維護,顯然當我們刷到j的位置大於s的時候我們就更新我們的dp方程,如果小於s那麼我們就需要維護我們的單調佇列的最值。

#include

using

namespace std;

const

int n=

1e4+

6010

;struct node

}node[n]

;int que[n]

,f[105

][n]

;signed

main()

if(j.s)}

} cout<[n]<}

圍欄(dp 單調佇列)

有n塊木板從左到右排成一行,有m個工匠對這些木板進行粉刷,每塊木板至多被粉刷一次。第 i 個木匠要麼不粉刷,要麼粉刷包含木板 si 的,長度不超過 lili 的連續的一段木板,每粉刷一塊可以得到 pi 的報酬。不同工匠的si不同。請問如何安排能使工匠們獲得的總報酬最多。輸入格式 第一行包含兩個整數n...

單調佇列 優化DP

佇列元素保持單調遞增 減 而保持的方式就是通過插隊,把隊尾破壞了單調性的數全部擠掉,從而使佇列元素保持單調。單調佇列的作用 優化dp。許多單調佇列優化的dp可以使複雜度直接降維,下面就以最簡單的一道題為例 在某兩座城市之間有 n 個烽火台,每個烽火台發出訊號都有一定代價。為了使情報準確地傳遞,在連續...

單調佇列優化dp

形如f i max wi的問題都可以用單調佇列優化。例題 板題 注意乙個地方 求完所有的f後 ans不是f n 而是後面的一段字尾的f 注意字尾的左端點。很顯然是rmq問題 計算字首和sum i 對於固定的右端點 i,我們想讓答案最大等價於max,可以用個單調佇列維護。但是隨便乙個資料結構直接on ...