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; }
时间: 2024-10-06 18:28:32