zoukankan      html  css  js  c++  java
  • POJ 3616 Milking Time(最大递增子序列变形)

    题目链接:http://poj.org/problem?id=3616

    题目大意:给你时间N,还有M个区间每个区间a[i]都有开始时间、结束时间、生产效率(时间都不超过N),只能在给出的时间段内生产,要求合理安排时间求出最大生产价值。

    解题思路:把区间按开始时间排序,于是有状态转移方程:dp[i]=max(dp[i],dp[j]+a[i].val)(前提是a[j].end+r<=a[i].start,i是区间的序号,j是i前面的区间)

         相当于最大递增子序列的变形,写法差不多。

    代码:

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cstring> 
     4 using namespace std;
     5 const int N=1e3+5;
     6 
     7 struct node{
     8     int start,end,val;
     9 }a[N];
    10 
    11 bool cmp(node a,node b){
    12     return a.start<b.start;
    13 }
    14 
    15 int dp[N];
    16 
    17 int main(){
    18     int n,m,r;
    19     while(~scanf("%d%d%d",&n,&m,&r)){
    20         for(int i=1;i<=m;i++)
    21             scanf("%d%d%d",&a[i].start,&a[i].end,&a[i].val);
    22         sort(a+1,a+1+m,cmp);
    23         
    24         int ans=0;
    25         //不重合的最大递增区间,类似最大递增子序列 
    26         for(int i=1;i<=m;i++){
    27             dp[i]=a[i].val;
    28             for(int j=1;j<i;j++){
    29                 if(a[j].end+r<=a[i].start){
    30                     dp[i]=max(dp[i],dp[j]+a[i].val);
    31                 }                
    32             }
    33             ans=max(ans,dp[i]);
    34         }
    35         printf("%d
    ",ans);
    36     }
    37     return 0;
    38 }

     

  • 相关阅读:
    网络基础之网络协议篇
    JVM-07-执行引擎
    JVM-06-对象实例化、内存布局、访问定位以及直接内存
    JVM-05-方法区
    JVM-04-堆
    JVM-03-本地方法接口和本地方法栈
    JVM-02-程序计数器 虚拟机栈
    JVM-01-类加载子系统
    JVM-00-引言
    swagger
  • 原文地址:https://www.cnblogs.com/fu3638/p/7506551.html
Copyright © 2011-2022 走看看