POJ-1821 Fence(单调队列优化DP)

来源:互联网 发布:betterment mac 编辑:程序博客网 时间:2024/05/22 08:09

Description

A team of k (1 <= K <= 100) workers should paint a fence which contains N (1 <= N <= 16 000) planks numbered from 1 to N from left to right. Each worker i (1 <= i <= K) should sit in front of the plank Si and he may paint only a compact interval (this means that the planks from the interval should be consecutive). This interval should contain the Si plank. Also a worker should not paint more than Li planks and for each painted plank he should receive Pi $ (1 <= Pi <= 10 000). A plank should be painted by no more than one worker. All the numbers Si should be distinct.

Being the team's leader you want to determine for each worker the interval that he should paint, knowing that the total income should be maximal. The total income represents the sum of the workers personal income.

Write a program that determines the total maximal income obtained by the K workers.

Input

The input contains:
Input

N K
L1 P1 S1
L2 P2 S2
...
LK PK SK

Semnification

N -the number of the planks; K ? the number of the workers
Li -the maximal number of planks that can be painted by worker i
Pi -the sum received by worker i for a painted plank
Si -the plank in front of which sits the worker i

Output

The output contains a single integer, the total maximal income.

Sample Input

8 43 2 23 2 33 3 51 1 7 

Sample Output

17

Hint

Explanation of the sample:

the worker 1 paints the interval [1, 2];

the worker 2 paints the interval [3, 4];

the worker 3 paints the interval [5, 7];

the worker 4 does not paint any plank

Source

Romania OI 2002


题意:给你一个长度为n的木板,有k个工人,每个工人有一个工作点,最大工作范围和费用,工作点必须被包含在工作范围内,问你这n个工人能得到的最大费用是多少。


分析:f[i][j]表示前i个工人刷到j能的到最大费用,随着j的增大,f[i][j]的决策区间也在不断右移,可以用单调队列优化。


#include <queue>  #include <vector>  #include <cstdio>  #include <utility>  #include <cstring>  #include <iostream>  #include <algorithm>  #define INF 0x3f3f3f3fusing namespace std; struct thing{int l,p,s;friend bool operator < (thing a,thing b){return a.s < b.s;}}a[105];int n,k,f[105][16005];int main(){cin.sync_with_stdio(false);cin>>n>>k;for(int i = 1;i <= k;i++) cin>>a[i].l>>a[i].p>>a[i].s;sort(a+1,a+1+k);memset(f,0,sizeof(f));for(int i = 1;i <= k;i++){deque <int>q;for(int j = 0;j <= n;j++){if(j < a[i].s){  while(!q.empty() && f[i-1][q.back()]-q.back()*a[i].p <= f[i-1][j]-j*a[i].p) q.pop_back(); q.push_back(j); }  f[i][j] = f[i-1][j]; if(j >= a[i].s && j-a[i].s+1 <= a[i].l)   { while(!q.empty() && j-q.front() > a[i].l) q.pop_front(); f[i][j] = max(f[i][j],f[i-1][q.front()] + (j-q.front())*a[i].p);}if(j != 0) f[i][j] = max(f[i][j-1],f[i][j]); } }cout<<f[k][n]; }

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 一周岁宝宝拉肚怎么办 三岁宝宝拉水怎么办 喝了过期的青汁怎么办 吃了黑心的苹果怎么办 新生儿两天没拉大便怎么办 贝亲奶瓶不漏怎么办 满月婴儿吃多了怎么办 婴儿吃撑了哭闹怎么办 新生儿吃撑了怎么办啊 新生儿吃了奶粉不吃奶怎么办 新生儿不吃奶也不吃奶粉怎么办 奶瓶吸奶费力不顺畅怎么办 宝宝吃奶粉太勤怎么办 香蕉和地瓜一起吃了怎么办 贝亲奶瓶泡沫多怎么办 四个多月的宝宝拉肚子怎么办 宝宝四个月了拉肚子怎么办 四个月宝宝火大怎么办 刚出生的宝宝便秘怎么办 小宝宝破腹产吸了几口羊水怎么办 换奶粉不拉屎了怎么办 婴儿吃奶粉不拉屎怎么办 1岁半突然不喝奶怎么办 6个月宝宝不吃奶粉怎么办 7个月宝宝不吃奶粉怎么办 5个月宝宝不吃奶粉怎么办 一岁两个月宝宝不长肉怎么办 7个月宝宝肚子疼怎么办 奶喝一半凉了怎么办 5个月孩子厌奶怎么办 怀孕后特别不爱吃水果怎么办 宝宝吃了无比滴怎么办 婴儿上火怎么办吃什么可以去火 肚子胀怎么办最快的方法 40天婴儿拉水怎么办 8个月宝宝坐不稳怎么办 宝宝段奶不吃奶粉怎么办 3个月宝宝头睡偏了怎么办 2个月婴儿抱着睡怎么办 两个半月的宝宝睡眠少怎么办 七个月宝宝不愿意坐怎么办