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 }