题目链接:
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次产奶量。
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef
long long ll;
#define MS(a) memset(a,0,sizeof(a))
#define MP make_pair
#define PB push_back
const int INF =
0x3f3f3f3f;
const ll INFLL =
0x3f3f3f3f3f3f3f3fLL;
inline ll read(){
ll x=
0,f=
1;
char ch=getchar();
while(ch<
'0'||ch>
'9'){
if(ch==
'-')f=-
1;ch=getchar();}
while(ch>=
'0'&&ch<=
'9'){x=x*
10+ch-
'0';ch=getchar();}
return x*f;
}
const int maxn =
1e3+
10;
struct node{
int l,r,e;
bool operator<(
const node& rhs)
const{
return l < rhs.l;
}
}cow[maxn];
int dp[maxn];
int main(){
int N,M,R;
cin >> N >> M >> R;
for(
int i=
0; i<M; i++){
cin >> cow[i].l >> cow[i].r >> cow[i].e;
cow[i].r += R;
}
sort(cow,cow+M);
for(
int i=
0; i<M; i++){
dp[i] = cow[i].e;
for(
int j=
0; j<i; j++){
if(cow[j].r <= cow[i].l)
dp[i] = max(dp[i],dp[j]+cow[i].e);
}
}
cout << *max_element(dp,dp+M) << endl;
return 0;
}
转载请注明原文地址: https://ju.6miu.com/read-19396.html