poj3616
题意:奶牛在1到n时间段内产奶,总共有m个产奶区间,买个区间有开始时间和结束时间,还有产奶量,同时每次产完奶需要休息一定的时间,求最大产奶量
分析:比较简单的dp,有点像最长上升子序列的变种,把产奶时间按开始时间排序,对于开始时间大于前面结束时间的点,求其最大的产奶量
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <string> 5 #include <vector> 6 #include <algorithm> 7 #include <set> 8 #include <map> 9 #include <bitset> 10 #include <cmath> 11 #include <queue> 12 #include <stack> 13 using namespace std; 14 const int maxn=1500; 15 int dp[maxn]; 16 typedef struct p 17 { 18 int start,over,value; 19 }p; 20 int n,m,r; 21 bool cmp(p a,p b) 22 { 23 return a.start<b.start; 24 } 25 int main() 26 { 27 while(cin>>n>>m>>r) 28 { 29 p s[maxn]; 30 for(int i=0;i<m;i++) 31 { 32 cin>>s[i].start>>s[i].over>>s[i].value; 33 s[i].over+=r; 34 } 35 sort(s,s+m,cmp); 36 memset(dp,0,sizeof(dp)); 37 for(int i=0;i<m;i++) 38 { 39 dp[i]=s[i].value; 40 for(int j=0;j<i;j++){ 41 if(s[i].start>=s[j].over) 42 dp[i]=max(dp[i],dp[j]+s[i].value); 43 } 44 } 45 int mx=0; 46 for(int i=0;i<m;i++) 47 mx=max(mx,dp[i]); 48 cout<<mx<<endl; 49 } 50 return 0; 51 }
时间: 2024-10-29 01:10:53