題意:
有乙個長度為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...