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 }