POJ 3616 Milking Time 动态规划

来源:互联网 发布:现在淘宝开什么店赚钱 编辑:程序博客网 时间:2024/04/28 15:55

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;}



0 0
原创粉丝点击