http://poj.org/problem?id=3616
题意:一个奶牛在0~N时间段内可被取奶,每次挤奶以后必须休息至少R分钟才能下次继续挤奶。有M次可以挤奶的时间段,每次取奶对应三个值:开始时间、结束时间、效率值,每次挤奶的过程不能中断。求出最大效率值。
解法:首先按照结束时间从小到大排序(按照结束时间排序方便后边的dp);dp[i]表示第i个挤奶时间段后,效率最大值。
转移方程如下:
初始化:dp[i] = data[i].eff
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 2000 + 10;
int N, R, M;
int dp[maxn];
struct Node
{
int ls, re;//开始时间、结束时间
int eff;//效率值
}data[maxn];
bool cmp(Node na, Node nb)
{
return na.re < nb.re;
}
int max(int a, int b)
{
if(a>b)
return a;
return b;
}
int main()
{
while(scanf("%d %d %d",&N, &M, &R)!=EOF)
{
int i, j;
for(i = 0; i < M; i++)
{
scanf("%d %d %d",&data[i].ls,&data[i].re, &data[i].eff);
}
sort(data, data + M, cmp);
//for(i = 0; i < M; i++)
// printf("%d %d %d\n",data[i].ls, data[i].re, data[i].eff);
memset(dp, 0, sizeof(dp));
dp[0] = 0;
for(i = 0; i < M; i++)
{
dp[i] = max(dp[i], data[i].eff);
for(j = 0; j < i; j++)
{
if( data[j].re + R <= data[i].ls )
dp[i] = max(dp[i], dp[j] + data[i].eff);
else
dp[i] = max(dp[i], dp[j]);
}
}
int ans = -1;
//for(i = 0; i < M; i++)
// ans = max(ans, dp[i]);
printf("%d\n",dp[M-1]);
}
return 0;
}