zoukankan      html  css  js  c++  java
  • poj-3616 Milking Time (区间dp)

    http://poj.org/problem?id=3616

    bessie是一头工作很努力的奶牛,她很关心自己的产奶量,所以在她安排接下来的n个小时以尽可能提高自己的产奶量。

    现在有m个产奶时间,每个都有一个开始时间和结束时间和这个时间内的产奶量,任意一个时间段产奶之后,bessie都要休息r个时间,问如果安排产奶才能得到最大值。

    注意这里m个时间其实都安排在n时间内,所以n其实是没用的。

    设dp[i]是前i个时间内最多的产奶量    dp[i]=max(dp[i-1],dp[p[i]]+w[i]);

    p[i]是与dp[i]最大不相容区间的下标。

    预处理出p[i],然后dp。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 using namespace std;
     5 
     6 struct job
     7 {
     8     int s,t,w;
     9     bool operator < (const job &a) const
    10     {
    11         return t<a.t;
    12     }
    13 };
    14 
    15 job p[1010];
    16 int f[1010],dp[1010];
    17 
    18 void compute(int m,int r)
    19 {
    20     f[1]=0;
    21     for(int i=2;i<=m;i++)
    22     {
    23         int k=i-1;
    24         while(k>0&&p[k].t+r>p[i].s)
    25             k--;
    26         f[i]=k;
    27     }
    28 }
    29 
    30 int main()
    31 {
    32     int n,m,r;
    33     while(~scanf("%d%d%d",&n,&m,&r))
    34     {
    35         for(int i=1;i<=m;i++) scanf("%d%d%d",&p[i].s,&p[i].t,&p[i].w);
    36         sort(p+1,p+m+1);
    37         compute(m,r);
    38         memset(dp,0,sizeof(dp));
    39         for(int i=1;i<=m;i++)
    40             dp[i]=max(dp[i-1],dp[f[i]]+p[i].w);
    41         printf("%d
    ",dp[m]);
    42 
    43     }
    44     return 0;
    45 }
  • 相关阅读:
    (SPOJ4)Transform the Expression
    Minix2.0操作系统kernel文件分析
    Minix2.0内核源代码的组织结构
    powerdesigner教程系列(三)
    多线程
    软件架构师成长之路
    保护sqlconnection的链接字符串中的密码不泄露
    powerdesigner教程系列(四)
    [Serializable]在C#中的作用.NET 中的对象序列化
    vps经典文章
  • 原文地址:https://www.cnblogs.com/nowandforever/p/4443467.html
Copyright © 2011-2022 走看看