POJ1821 Fence 單調佇列優化DP

2022-06-03 06:45:10 字數 897 閱讀 7145

題意:給長度為n的木板,k個工人,每個工人要麼不粉刷,或者選擇乙個包含木板si,長度不超過li的連續的一段木板粉刷,每粉刷一塊得到pi的報酬,問如何安排工人使得總報酬最大?

思路:可以按si給工人排序,這樣我們就可以按照順序依次安排工人。設f[i][j]表示到第i個工人,刷到前j塊木板的最大報酬,

三種情況

工人不刷:f[i][j]=f[i-1][j]

木板空著:f[i][j]=f[i][j-1]

第i個工人刷k+1到j的木板,其中k,j滿足k+1<=si<=j,報酬就是f[i][j]=f[i-1][k]+pi*(j-k),拆開得pi*j+(-pi*k+f[i-1][k])。可以發現對於每個j來說,要找到它對應的最大報酬,需要嘗試範圍內的所有k值,而實際上我們可以發現隨著列舉j,j的增大,所對應的k的區間範圍的上下界也是遞增的,這樣的話,我們就可以考慮使用單調佇列來優化列舉k的過程,又因為要使報酬最大,所以我們需要維護乙個單調遞減的序列來維護-pi*k+f[i-1][k]這個只與k相關的最大值。

#include#include

using

namespace

std;

const

int maxn=16005

;struct

note

a[maxn];

intq[maxn];

bool

operator

<(note a,note b)

int f[105

][maxn];

int calc(int i,int

k)int

main()

for(int j=1; j<=n; j++)}}

printf(

"%d\n

",f[k][n]);

}

單調佇列1006 POJ 1821 Fence

題意 有乙個長度為n的牆壁,有k個粉刷匠來刷牆 每個粉刷匠都有三種屬性 1.最大刷牆的距離 必須是連續的區間 2.刷每塊牆的 3.初始位置 刷牆的區間必須包含初始位置 求這幾個粉刷匠刷長度為n的牆最多賺多少錢 思路 我們考慮 dp i j 為前i個粉刷匠刷前j面牆最多的賺的錢 我們考慮對於每個粉刷匠...

POJ 1821 單調佇列優化DP

題意 有一道線性籬笆由n個連續的木板組成。有k個工人,你要叫他們給木板塗色。每個工人有3個引數 l 表示 這個工人可以塗的最大木板數目,s表示這個工人站在哪一塊木板,p表示這個工人每塗乙個木板可以得到的錢。要注意的是,工人i可以選擇不塗任何木板,否則,他的塗色區域必須是連續的一段,並且s i 必須包...

D 訓練技巧(dp,單調佇列優化)

有n天,每天訓練收益為ei,如果連續訓練了k天,則必須休息一天,問訓練的最大收益,1 n,k 1e5 dp i 表示第i天不訓練,前i天的最小損失,dp i min dp i dp j a i j i 1 i 2 i k 1 答案就是第n 1天不訓練,sum 前n天的最小損失嘍 這樣還是會超時,需要...