poj-3616 Milking Time (区间dp)

http://poj.org/problem?id=3616

bessie是一头工作很努力的奶牛,她很关心自己的产奶量,所以在她安排接下来的n个小时以尽可能提高自己的产奶量。

现在有m个产奶时间,每个都有一个开始时间和结束时间和这个时间内的产奶量,任意一个时间段产奶之后,bessie都要休息r个时间,问如果安排产奶才能得到最大值。

注意这里m个时间其实都安排在n时间内,所以n其实是没用的。

设dp[i]是前i个时间内最多的产奶量    dp[i]=max(dp[i-1],dp[p[i]]+w[i]);

p[i]是与dp[i]最大不相容区间的下标。

预处理出p[i],然后dp。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 
 6 struct job
 7 {
 8     int s,t,w;
 9     bool operator < (const job &a) const
10     {
11         return t<a.t;
12     }
13 };
14 
15 job p[1010];
16 int f[1010],dp[1010];
17 
18 void compute(int m,int r)
19 {
20     f[1]=0;
21     for(int i=2;i<=m;i++)
22     {
23         int k=i-1;
24         while(k>0&&p[k].t+r>p[i].s)
25             k--;
26         f[i]=k;
27     }
28 }
29 
30 int main()
31 {
32     int n,m,r;
33     while(~scanf("%d%d%d",&n,&m,&r))
34     {
35         for(int i=1;i<=m;i++) scanf("%d%d%d",&p[i].s,&p[i].t,&p[i].w);
36         sort(p+1,p+m+1);
37         compute(m,r);
38         memset(dp,0,sizeof(dp));
39         for(int i=1;i<=m;i++)
40             dp[i]=max(dp[i-1],dp[f[i]]+p[i].w);
41         printf("%d\n",dp[m]);
42 
43     }
44     return 0;
45 }

 

posted @ 2015-04-21 09:42  NowAndForever  阅读(154)  评论(0编辑  收藏  举报