單調佇列1006 POJ 1821 Fence

2021-07-15 01:41:25 字數 1337 閱讀 2581

題意:

有乙個長度為n的牆壁,有k個粉刷匠來刷牆

每個粉刷匠都有三種屬性

1.最大刷牆的距離(必須是連續的區間

2.刷每塊牆的**

3.初始位置(刷牆的區間必須包含初始位置

求這幾個粉刷匠刷長度為n的牆最多賺多少錢

思路:

我們考慮

dp[i][j]為前i個粉刷匠刷前j面牆最多的賺的錢

我們考慮對於每個粉刷匠刷牆

把牆分成兩種

1.能刷到的

2.刷不到的

對於刷不到的我們自然就取dp[i-1][j]和dp[i][j-1]了

對於能刷到的

如果當前粉刷匠要刷的話就是

dp[i][k]+(j-k)*price[i]由於當前j是固定的

所以我們只需要求最大的dp[i][k]-k*price[i]

還有一點是我們對於每個j的k的範圍是要變的

所以我們相當於維護乙個固定大小的視窗裡的最大值

所以就要用到單調佇列了

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define lowbit(x) (x&(-x))

typedef

long

long ll;

const

int maxn = 16005;

const

int inf=(1

<<28)-1;

struct node

a[105];

bool cmp(node u,node v)

sort(a+1,a+k+1,cmp);

//因為我們dp[i][k]是需要之前的max(dp[1~i][0~k-1])

memset(dp,0,sizeof(dp));

for(int i=1;i<=k;++i)

que.push_back(make_pair(subnum,j));

}if(a[i].initpos<=j&&j<=a[i].right)

dp[i][j]=max(dp[i][j],que.front().first+tmp);}}

}printf("%d\n",dp[k][n]);

}return

0;}

POJ 1821 單調佇列優化DP

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

POJ1821 Fence 單調佇列優化DP

題意 給長度為n的木板,k個工人,每個工人要麼不粉刷,或者選擇乙個包含木板si,長度不超過li的連續的一段木板粉刷,每粉刷一塊得到pi的報酬,問如何安排工人使得總報酬最大?思路 可以按si給工人排序,這樣我們就可以按照順序依次安排工人。設f i j 表示到第i個工人,刷到前j塊木板的最大報酬,三種情...

POJ 2823單調佇列

g tle了,c 5329ms險過。用g 交了幾遍,總覺得沒錯,也沒改就反覆交了,傻裡傻氣的。再在網路上找了一 g ce後c 過了,就也試著用c 交自己的 了,過了。要不咱研究研究g 和c 好了 以上全是廢話!include using namespace std const int nn 1000...