首页 > 代码库 > 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 动态规划