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;
    }
  • 相关阅读:
    opensuse字符和图形界面
    Eclipse编辑器小手段
    切换运行时用户以及用户组
    PHP安装和配置
    Linux程序资源限制简述
    test2234343
    找回Svn和Git不见的文件图标
    SourceInsight使用技巧
    Javascript数组使用方法
    MySQL安装和配置
  • 原文地址:https://www.cnblogs.com/IKnowYou0/p/6638625.html
Copyright © 2011-2022 走看看