Milking Time POJ 3616(基础dp)

原题

题目链接

题目分析

简单dp,很容易想到对于每个区间都只有两个选择,选和不选,因此可以定义一个dp[i],表示在前第i个区间能取得的最大奶量(区间已按起始时间排完序),注意在读入区间时可以直接在末尾时间直接加上R.更新由两个循坏来更新,第一个循环i从头区间遍历到尾区间,第二个循环j从头区间到i区间(不包括i区间),更新时要先判定是否满足cow[i].x>=cow[j].y,满足的话就更新dp[i]=max(dp[i],cow[i].efficiency+dp[j]).最后扫一遍dp数组取最大值就是答案.

代码

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <utility>
 6 #include <ctime>
 7 #include <cmath>
 8 #include <cstring>
 9 #include <string>
10 #include <stack>
11 #include <queue>
12 #include <vector>
13 #include <set>
14 #include <map>
15 
16 using namespace std;
17 typedef long long LL;
18 const int INF_INT=0x3f3f3f3f;
19 const LL INF_LL=0x3f3f3f3f3f3f3f3f;
20 
21 struct P
22 {
23     int x,y,z;
24     bool operator < (const P &a)const
25     {
26         return x<a.x;
27     }
28 };
29 
30 LL dp[2000];
31 P cow[2000];
32 
33 int main()
34 {
35 //    freopen("black.in","r",stdin);
36 //    freopen("black.out","w",stdout);
37     int n,m,r;
38     cin>>n>>m>>r;
39     for(int i=1;i<=m;i++) cin>>cow[i].x>>cow[i].y>>cow[i].z,cow[i].y+=r;
40     sort(cow+1,cow+m+1);
41     for(int i=1;i<=m;i++) dp[i]=cow[i].z;
42     for(int i=1;i<=m;i++)
43     {
44         for(int j=1;j<i;j++)
45         {
46             if(cow[i].x>=cow[j].y)
47             {
48                 dp[i]=max(dp[i],cow[i].z+dp[j]);
49             }
50         }
51     }
52     LL ans=0;
53     for(int i=1;i<=m;i++) ans=max(ans,dp[i]);
54     cout<<ans<<endl;
55     return 0;
56 }

 

posted @ 2019-08-24 17:07  VBL  阅读(131)  评论(0编辑  收藏  举报