首页 > 代码库 > POJ 3616 Milking Time 动态规划
POJ 3616 Milking Time 动态规划
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; }
POJ 3616 Milking Time 动态规划
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。