Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 3586 | Accepted: 1087 |
Description
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
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
Sample Input
8 4 3 2 2 3 2 3 3 3 5 1 1 7
Sample Output
17
Hint
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
題目大意:
一段籬笆由N個連續的木板組成。有K個工人給木板塗色。
每個工人有3個屬性:L 表示他塗的最長連續木板區間長度,S表示他必須塗哪一塊,P表示每塗一個木板的收益。
要注意的是,工人i可以選擇不塗任何木板,否則,他的塗色區域必須是連續的一段,並且S[i]必須包含在內。
最後還有,每塊木板只能被塗一次。
自己寫的代碼,等功夫夠了再回來擼
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string>
#include <vector>
#include <list>
#include <map>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <numeric>
#include <functional>
#define maxn 16015
#define maxk 115
using namespace std;
struct W{
int l,p,s;
};
W worker[maxk];
int N,K;
int dp[maxk][maxn];
int comp(const W &a,const W &b)
{
return a.s<b.s;
}
int main()
{
scanf("%d %d",&N,&K);
for(int i=1;i<=K;i+=1){
scanf("%d %d %d",&worker[i].l,&worker[i].p,&worker[i].s);
}
sort(worker+1,worker+K+1,comp);
memset(dp,0,sizeof(dp));
dp[1][worker[1].s]+=min(worker[1].s,worker[1].l)*worker[1].p;
for(int i=worker[1].s+1;i<=worker[1].s+worker[1].l-1;i+=1){
dp[1][i]+=min(i,worker[1].l)*worker[1].p;
}
int ans=0;
worker[0].s=0,worker[0].l=0,worker[0].p=0;
for(int i=1;i<=K;i+=1){
for(int ii=0;ii<=i;ii+=1){
for(int j=worker[i].s;j<=worker[i].s+worker[i].l-1&&j<=N;j+=1){
for(int k=worker[ii].s;!k||k<=worker[ii].s+worker[ii].l-1&&k<=j;k+=1){
dp[i][j]=max(dp[i][j],dp[ii][k]+min(j-k,worker[i].l)*worker[i].p);
}
}
}
if(i==K){
for(int j=worker[i].s;j<=worker[i].s+worker[i].l-1&&j<=N;j+=1){
ans=max(ans,dp[i][j]);
}
}
}
printf("%d\n",ans);
return 0;
}