题目连接:http://poj.org/problem?id=3616
题意:一个奶牛在0~N时间段内可被取奶,每次挤奶以后必须休息至少R分钟才能下次继续挤奶。有M次可以挤奶的时间段,每次取奶对应三个值:开始时间、结束时间、效率值,每次挤奶的过程不能中断。求出最大效率值。
解法:首先按照结束时间从小到大排序(按照结束时间排序方便后边的dp);dp[i]表示第i个挤奶时间段后,效率最大值。
转移方程如下:

初始化:dp[i] = data[i].eff
代码如下:
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 using namespace std; 6 7 const int maxn = 2000 + 10; 8 int N, R, M; 9 int dp[maxn]; 10 struct Node 11 { 12 int ls, re;//开始时间、结束时间 13 int eff;//效率值 14 }data[maxn]; 15 16 bool cmp(Node na, Node nb) 17 { 18 return na.re < nb.re; 19 } 20 int max(int a, int b) 21 { 22 if(a>b) 23 return a; 24 return b; 25 } 26 int main() 27 { 28 while(scanf("%d %d %d",&N, &M, &R)!=EOF) 29 { 30 int i, j; 31 for(i = 0; i < M; i++) 32 { 33 scanf("%d %d %d",&data[i].ls,&data[i].re, &data[i].eff); 34 } 35 sort(data, data + M, cmp); 36 //for(i = 0; i < M; i++) 37 // printf("%d %d %d\n",data[i].ls, data[i].re, data[i].eff); 38 memset(dp, 0, sizeof(dp)); 39 dp[0] = 0; 40 for(i = 0; i < M; i++) 41 { 42 dp[i] = max(dp[i], data[i].eff); 43 for(j = 0; j < i; j++) 44 { 45 if( data[j].re + R <= data[i].ls ) 46 dp[i] = max(dp[i], dp[j] + data[i].eff); 47 else 48 dp[i] = max(dp[i], dp[j]); 49 } 50 } 51 int ans = -1; 52 //for(i = 0; i < M; i++) 53 // ans = max(ans, dp[i]); 54 printf("%d\n",dp[M-1]); 55 } 56 return 0; 57 }

浙公网安备 33010602011771号