POJ 3616 Milking Time 【DP】

题意:奶牛Bessie在0~N时间段产奶。农夫约翰有M个时间段可以挤奶,时间段f,t内Bessie能挤到的牛奶量e。奶牛产奶后需要休息R小时才能继续下一次产奶,求Bessie最大的挤奶量。
思路:一定是对时间段dp,然后就是两个for的事了。只要前面能满足条件的状态就可以转移过来,然后取最大,不过要先排序。
状态设定:dp[i]表示从开始取,到满足取第i段的最优值。

定义dp[i]表示第i个时间段挤奶能够得到的最大值,拆开来说,就是前面 i – 1个时间段任取0到i – 1个时间段挤奶,然后加上这个时间段(i)的产奶量之和。dp[i]满足如下递推关系
if(e[i].x>=e[j].y+r)
     dp[i]=max(dp[i],dp[j]+e[i].w);

#include <iostream>
#include <cstdio>
#include <queue>
#include <math.h>
#include <string.h>
#include <string>
#include <algorithm>
using namespace std;


struct eg
{
    int x,y,w;
}e[1005];

bool cmp(eg a,eg b)
{
    if(a.x==b.x)
        return a.y<b.y;
    return a.x<b.x;
}

int main()
{
    int n,m,r,dp[1005],ans;
    scanf("%d%d%d",&n,&m,&r);
    for(int i=0;i<m;i++)
    {
        scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].w);
    }
    sort(e,e+m,cmp);
    ans=0;
    for(int i=0;i<m;i++)
        dp[i]=e[i].w;
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<i;j++)
        {
            if(e[i].x>=e[j].y+r)
                dp[i]=max(dp[i],dp[j]+e[i].w);
        }
        ans=max(ans,dp[i]);
    }
    printf("%d",ans);
    return 0;
}
posted @ 2017-08-07 13:16  demianzhang  阅读(384)  评论(0编辑  收藏  举报