• poj1821


      题意大致是有k个粉刷匠,要粉刷n面墙,分别站在某一面墙si的前面,他们每个人只愿意刷li面墙,而且每刷一面需要给pi的工钱,题目要求最多能发多少工钱。

    思路:斜率优化dp

            思路跟http://www.cnblogs.com/yzcstc/articles/2870355.html这里面说的差不多

     1 /*
     2   State:Accepted
     3   Time:2013-03-11 23:03:01
     4 */
     5 #include <iostream>
     6 #include <cstring>
     7 #include <string>
     8 #include <cstdlib>
     9 #include <cstdio>
    10 #include <algorithm>
    11 #include <cmath>
    12 #include <queue>
    13 using namespace std;
    14 struct oo{ int l, p , s; };
    15 int n , k;
    16 int f[120][16010], q[100000] ,le[150], re[150];
    17 oo  worker[150];
    18 
    19 bool cmp(const oo a , const oo b){ return a.s < b.s; }
    20 void init()
    21 {
    22      scanf("%d%d",&n, &k);
    23      for (int i = 1; i <= k ; ++i)
    24           scanf("%d%d%d",&worker[i].l ,  &worker[i].p, &worker[i].s);
    25      sort(worker + 1,  worker + 1 +k, cmp);
    26      for (int i = 1; i <= k; ++i){
    27          le[i] = max(0 ,worker[i].s - worker[i].l);
    28          re[i] = min(n ,worker[i].s + worker[i].l - 1);
    29      }
    30 }
    31 
    32 void dp()
    33 {
    34      
    35      int l , s , p , h ,t;
    36      for (int i = 1; i <= k ; ++i)
    37      {
    38         l = worker[i].l;
    39         s = worker[i].s;
    40         p = worker[i].p;
    41         for (int j = 0; j <= re[i]; ++j)
    42              f[i][j] = f[i-1][j];
    43         h =1;
    44         t = 0;
    45         for (int j = le[i]; j < s; ++j)
    46         {
    47             while (t >= h && f[i-1][j] - j*p >= f[i-1][q[t]] - q[t]*p) --t;
    48             q[++t] = j;
    49         }
    50         for (int j = s; j <= re[i]; ++j)
    51         {
    52             while (t > h && j - q[h] > l) ++h;
    53             f[i][j] = max(f[i][j-1], f[i-1][j]);
    54             f[i][j] = max(f[i][j] , f[i-1][q[h]] + (j-q[h])*p);
    55         }
    56         for (int j = re[i]+1; j <=n ; ++j)
    57            f[i][j] = max(f[i-1][j], f[i][j-1]);
    58      }
    59      int ans = 0;
    60      for (int i = 1; i <= n ; ++i)
    61          ans  = max(ans , f[k][i]);
    62      printf("%d\n",ans);
    63 }
    64 
    65 
    66 int main(){
    67      freopen("poj1821.in","r",stdin);
    68      freopen("poj1821.out","w",stdout);
    69      init();
    70      dp();
    71 }
  • 相关阅读:
    HBase
    linux配置环境变量
    ubuntu17.04安装flash
    WebService服务及客户端 编程
    eclipse
    设计模式:简单工厂
    设计模式:工厂方法
    C#加载dll 创建类对象
    C#线程
    Opencv 3入门(毛星云)摘要
  • 原文地址:https://www.cnblogs.com/yzcstc/p/2977925.html
Copyright © 2020-2023  润新知