POJ 3616 Milking Time

解题思路:

dp[i]:选择第i个区间获得最大值
1.只在第i个区间取奶 dp[i]=node[i].val;
2.如果能在前面已经取奶的后面接着取奶 node[j].ed+R<=node[i].st 时dp[i]=dp[j]+node[i].val;
dp[i]=max(dp[i],dp[j]+node[i].val)(j<i)

实现代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int MAXN=10000;
const int INF=1<<30;

/*
dp[i]:选择第i个区间获得最大值
1.只在第i个区间取奶 dp[i]=node[i].val;
2.如果能在前面已经取奶的后面接着取奶  node[j].ed+R<=node[i].st 时dp[i]=dp[j]+node[i].val;
dp[i]=max(dp[i],dp[j]+node[i].val)(j<i)

*/
struct Node{
    int st,ed;
    int val;
    bool operator <(const Node &rhs) const{
        if(ed!=rhs.ed)
            return ed<rhs.ed;
        else
            return st<rhs.st;
    }
}node[MAXN];

int dp[MAXN];


int main(){
    int N,M,R;
    while(scanf("%d%d%d",&N,&M,&R)!=EOF){
        for(int i=0;i<M;i++)
            scanf("%d%d%d",&node[i].st,&node[i].ed,&node[i].val);
        sort(node,node+M);

        memset(dp,0,sizeof(dp));
        int res=-INF;
        for(int i=0;i<M;i++){
            dp[i]=node[i].val;
            for(int j=0;j<i;j++){
                if(node[j].ed+R<=node[i].st)
                    dp[i]=max(dp[i],dp[j]+node[i].val);
            }
            res=max(dp[i],res);
        }
        cout<<res<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/IKnowYou0/p/6638625.html