题目链接:
http://poj.org/problem?id=3616
题意:
奶牛Bessie在0~N时间段产奶。农夫约翰有M个时间段可以挤奶,时间段f,t内Bessie能挤到的牛奶量e。奶牛产奶后需要休息R小时才能继续下一次产奶,求Bessie最大的挤奶量。
题解:
定义dp[i]表示第i个时间段挤奶能够得到的最大值,拆开来说,就是前面 i – 1个时间段任取0到i – 1个时间段挤奶,然后加上这个时间段(i)的产奶量之和。dp[i]满足如下递推关系:
第i个时间段挤奶的最大值 = 前 i – 1 个时间段挤奶最大值中的最大值 + 第i次产奶量。
代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 typedef long long ll; 6 #define MS(a) memset(a,0,sizeof(a)) 7 #define MP make_pair 8 #define PB push_back 9 const int INF = 0x3f3f3f3f; 10 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL; 11 inline ll read(){ 12 ll x=0,f=1;char ch=getchar(); 13 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 14 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 15 return x*f; 16 } 17 ////////////////////////////////////////////////////////////////////////// 18 const int maxn = 1e3+10; 19 20 struct node{ 21 int l,r,e; 22 bool operator<(const node& rhs)const{ 23 return l < rhs.l; 24 } 25 }cow[maxn]; 26 27 int dp[maxn]; 28 29 int main(){ 30 int N,M,R; 31 cin >> N >> M >> R; 32 for(int i=0; i<M; i++){ 33 cin >> cow[i].l >> cow[i].r >> cow[i].e; 34 cow[i].r += R; 35 } 36 sort(cow,cow+M); 37 38 // dp[i] : 表示第i个时间段挤奶能够得到的最大值,拆开来说,就是前面 i – 1个时间段任取0到i – 1个时间段挤奶,然后加上这个时间段(i)的产奶量之和 39 40 for(int i=0; i<M; i++){ 41 dp[i] = cow[i].e; 42 for(int j=0; j<i; j++){ 43 if(cow[j].r <= cow[i].l) 44 dp[i] = max(dp[i],dp[j]+cow[i].e); 45 } 46 } 47 48 cout << *max_element(dp,dp+M) << endl; 49 50 return 0; 51 }