Milking Time POJ - 3616

原题链接

考察:线性dp

LIS的延伸题

思路:

       当区间没有重叠部分的时候,就可以加上+f[j].

       注意:当有重叠部分的时候,不能f[i] = max(f[i],f[j]),如果数据eg:[1,10] [2,3] [4,19]3区间会把2区间加上,而2区间必须是原w .

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 using namespace std;
 5 const int M = 1010;
 6 struct Interval{
 7     int l,r,w;
 8     bool operator<(Interval s)
 9     {
10         if(this->l==s.l) return this->w>s.w;
11         return this->l<s.l;
12     }
13 }in[M];
14 int n,m,r,f[M],ans;
15 int main() 
16 {
17     scanf("%d%d%d",&n,&m,&r);
18     for(int i=1;i<=m;i++)
19     {
20         scanf("%d%d%d",&in[i].l,&in[i].r,&in[i].w);
21         in[i].r+=r;
22     }
23     sort(in+1,in+m+1);
24     for(int i=1;i<=m;i++)
25     {
26         f[i] = in[i].w;
27         for(int j=1;j<i;j++)
28             if(in[j].r<=in[i].l&&in[i].l<=n) f[i] = max(f[i],f[j]+in[i].w);
29         ans = max(f[i],ans);
30     }
31     printf("%d\n",ans);
32     return 0;
33 }

 

posted @ 2021-03-15 12:16  acmloser  阅读(29)  评论(0编辑  收藏  举报