zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    2017中国大学生程序设计竞赛
    HDU 1426 Sudoku Killer【DFS 数独】
    Silver Cow Party---poj3268(最短路,迪杰斯特拉)
    Heavy Transportation---poj1797
    Cow Contest---poj3660
    Frogger--poj2253
    最短路基础
    打字母小游戏
    蔡勒(Zeller)公式--黑色星期五
    2的次幂表示
  • 原文地址:https://www.cnblogs.com/demian/p/7298642.html
Copyright © 2011-2022 走看看