POJ3616-递推-Milking Time

http://poj.org/problem?id=3616
输入m,n,r。
一头牛在1-m时间内要产奶,n个时间段,每个时间段产量不同,有点开始就不能结束,并且每次产玩都要休息r分钟,问你如何分配次数能让奶最多
(每次休息的时候可能会和其他时间段有交叉,那样那个时间段就不能产奶了,问的就是这个问题)
简单的不得了。。
dp[i]=max(dp[i],dp[j]+vali);i为截止当前段内,最大的奶量

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
/*给定你一个牛,和你挤奶的时间。
在这段时间内,牛的奶量是不同的,问你如何
搭配时间,这样他的奶量最大
挤一次就要休息一段时间,这一段时间可能会错过奶量更大的
,所以就是要解决这个问题。
*/
const int maxn=1020;
vector<pair<pair<int,int>,int> >v;
bool cmp2(pair<pair<int,int>,int>a,pair<pair<int,int>,int> b){
      if(a.first.first==b.first.first)
       return a.first.second<b.first.second;
      return a.first.first<b.first.first;

}
int main()
{   int dp[maxn];
    int m,n,r;
    int a,b,c;
    while(~scanf("%d%d%d",&m,&n,&r))
     {   v.clear();
         memset(dp,0,sizeof(dp));
         for(int i=1;i<=n;i++){
             scanf("%d%d%d",&a,&b,&c);
            v.push_back(make_pair(make_pair(a,b),c));
         }
         sort(v.begin(),v.end(),cmp2);
        for(int i=0;i<v.size();i++){
            dp[i]=v[i].second;
            for(int j=0;j<i;j++){
                if(v[j].first.second+r<=v[i].first.first)
                    dp[i]=max(dp[i],dp[j]+v[i].second);
            }
        }
        int ans=-1;
        for(int i=0;i<v.size();i++){
            ans=max(ans,dp[i]);
        }
 cout<<ans<<endl;
     }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值