zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    JS动态计算rem
    Vue数据双向绑定原理
    NOI2019 退役记
    友情链接
    算法博客总结
    总结各类错误(always online)
    学习笔记:powerful number求积性函数前缀和
    LOJ#2409. 「THUPC 2017」小 L 的计算题 / Sum(生成函数)
    多项式简单操作
    LOJ #3103. 「JSOI2019」节日庆典
  • 原文地址:https://www.cnblogs.com/IKnowYou0/p/6638625.html
Copyright © 2011-2022 走看看