首先按限制高度排序,然后按多重背包做dp

这里的背包只用知道每种状态是否可行,所以

这里的多重背包可以变成O(nm)

 const max=;
var f:array[..,..,..] of longint;
    a,b:array[..] of longint;
    i,j,k1,k2,n,k,m,w,ans,t:longint;
function findmin(t:longint):longint;
  var p,k:longint;
  begin
    p:=max;
    for k:= to do
      p:=min(p,f[k1,j-t,k]);
    exit(p);
  end;
procedure sort(l,r: longint); //按列排序,上下都有牛时1在前2在后,这样处理dp的时候方便多
  var i,j,x,y: longint;
  begin
    i:=l;
    j:=r;
    x:=a[(l+r) div ];
    y:=b[(l+r) div ];
    repeat
      while (a[i]<x) or (a[i]=x) and (b[i]<y) do inc(i);
      while (x<a[j]) or (a[j]=x) and (b[j]>y) do dec(j);
      if not(i>j) then
      begin
        swap(a[i],a[j]);
        swap(b[i],b[j]);
        inc(i);
        j:=j-;
      end;
    until i>j;
    if l<j then sort(l,j);
    if i<r then sort(i,r);
  end; procedure doit1;
  begin
    f[k2,j,]:=min(f[k2,j,],f[k1,j,]+*(a[i]-a[i-]));
    f[k2,j,]:=min(findmin()+,f[k2,j,]);
  end; procedure doit2;
  var p:longint;
  begin
    f[k2,j,]:=min(f[k1,j,]+*(a[i]-a[i-]),f[k2,j,]);
    p:=min(min(f[k1,j-,],f[k1,j-,]),f[k1,j-,]);
    f[k2,j,]:=min(f[k2,j,],p+a[i]-a[i-]+);
    if j->= then
      f[k2,j,]:=min(f[k2,j,],findmin()+);
  end; procedure doit(x:longint);
  var p:longint;
  begin
    p:=min(f[k1,j,x],f[k1,j,]);
    f[k2,j,x]:=min(f[k2,j,x],p+a[i]-a[i-]);
    f[k2,j,x]:=min(f[k2,j,x],findmin()+);
  end; begin
  readln(n,k,m);
  for i:= to n do
    readln(b[i],a[i]);
  sort(,n);
  for i:= to k do  //初始化
    for j:= to do
    begin
      f[,i,j]:=max;
      f[,i,j]:=max;
    end;
  i:=;
  f[,,]:=;
  if a[i]=a[i+] then
  begin
    i:=;
    f[,,]:=;
  end
  else begin
    i:=;
    if b[]= then f[,,]:=
    else f[,,]:=;
  end;
  k1:=;
  k2:=;
  while i<=n do
  begin
    k1:=k1 xor ; //滚动数组
    k2:=k2 xor ;
    if a[i]=a[i+] then w:= else w:=;
    for j:= to k do
    begin
      for t:= to do
        f[k2,j,t]:=max;
      doit1;  //做4个状态,方程式自己动手比划一下就明白了
      doit2;
      if w= then
      begin
        if b[i]= then
          doit()
        else doit();
      end;
    end;
    i:=i+w;
  end;
  ans:=max;
  for i:= to do
    ans:=min(ans,f[k2,k,i]);
  writeln(ans);
end.

注意:一般的多重背包复杂度到O(nm)必须使用单调队列,这里是特殊情况

poj2392的更多相关文章

  1. 多重背包问题:POJ2392

    这是一道完全背包问题,只不过增加了限制条件. 在更新最大值的时候,我注释掉了错误的方式,却不明白为什么是错误的,如果有人看到这篇博客,并且知道为什么那样更新是错误的,请指教,谢谢. 上代码: #inc ...

  2. poj2392 多重背包

    //Accepted 868 KB 188 ms //多重背包 #include <cstdio> #include <cstring> #include <iostre ...

  3. poj2392 Space Elevator(多重背包)

    http://poj.org/problem?id=2392 题意: 有一群牛要上太空.他们计划建一个太空梯-----用一些石头垒.他们有K种不同类型的石头,每一种石头的高度为h_i,数量为c_i,并 ...

  4. POJ2392 SpaceElevator [DP]

    题目大意:有一头奶牛要上太空,他有非常多种石头,每种石头的高度是hi,可是不能放到ai之上的高度.而且这样的石头有ci个 将这些石头叠加起来.问可以达到的最高高度. 解题思路:首先对数据进行升序排序. ...

  5. Space Elevator [POJ2392] [DP][优化]

    题目大意 n件物品,第i件hi高,有ci件,最高的一件不能超过ai的高度.问最高能堆多高 输入: 第一行,一个n 接下来每一行,为hi,ai,ci 输出,最高堆多高 样例输入: 37 40 35 23 ...

  6. POJ2392 Space Elevator

    题目:http://poj.org/problem?id=2392 一定要先按高度限制由小到大排序! 不然就相当于指定了一个累加的顺序,在顺序中是不能做到“只放后面的不放前面的”这一点的! 数组是四十 ...

  7. dp之多重背包poj2392

    题意:有k种石头,高为hi,在不超过ai的高度下,这种石头可以放置,有ci种这个石头,求这些石头所能放置的最高高度......... 思路:以往的什么硬币种数,最大硬币数之类的,他们的硬币都已经是排好 ...

  8. poj2392 Space Elevator(多重背包问题)

    Space Elevator   Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8569   Accepted: 4052 ...

  9. poj2392磊石头——排序后背包

    题目: 首先按限制高度从小到大排序,不会影响可行解,而不排序可能卡掉正确的情况: 用%2滚动数组时一定注意每次复制上一种情况,因为这个WA了好几次. 代码如下: #include<iostrea ...

随机推荐

  1. 怎样下载安装Firebug和使用Firebug

    Firebug是基于火狐(FireFox)浏览器的一个插件,它的作用是给Web页面开发者一个很好的测试前端页面代码的工具.所以深受网页开发者或网页布局爱好者的喜爱.像我们用DIV+CSS和html所写 ...

  2. Python本地化例子 - gettext 模块

    关键字:Python 3.4,gettext,本地化,Localization OS:Windows 7,Mac 1. 创建一个locsample.py文件,文件内容如下,把所有需要本地化的字符串放到 ...

  3. proguardgui.bat来混淆已有的jar包

    1.U:\android-sdk\tools\proguard\bin\找到 proguardgui.bat,双击就可以弹出一个混淆的界面 2.加入不要混淆的,比如我们用的系统的,还有别人的jar 3 ...

  4. Web 高性能开发汇总

    1. Http服务器: 让Windows Server 2008+IIS 7+ASP.NET支持10万个同时请求 大规模网站架构实战之体系结构(一) 大规模网站架构之WEB加速器SQUID(二) ii ...

  5. 分类-Category

    1.基本用途 如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式 继承 分类(Category) 2.格式 分类的声明 @interface 类名 (分类名称) // 方法声明 @end 分 ...

  6. css3 简单界面动画

    asdasdasdasda asdasdasdasda

  7. Xcode界面简介

    创建 Object-C 程序 进入主界面方式 : 打开 Xcode 之后, 可以使用 Xcode 菜单, 但是必须创建一个 Object-C 工程 或者 导入 一个 Object-C 工程才可以进入主 ...

  8. 自己利用jQuery实现的win8图标浮动更新

    在学校参加网页设计大赛时,由于美工设计的刚好是metro风格的(其实她们从来没有用过win8也没有了解过),而本人也很喜欢win8的界面,于是就做了一个metro风格的作品.虽然最终没能获奖,但是觉得 ...

  9. good mind

    1.如果你能做的事,员工也能做,就让员工做好了. 2.代码是一行一行执行的. 3.如果你找不到NB的人,那就找勤奋点的人.

  10. oracle 导出数据和导入数据

    导出数据 exp zl_gj/zlkj@gqxt  grants=y tables=(zl_gj.ckgj,zl_gj.gjlx,zl_gj.rkgj) file=c:\gj.dmp log=c:\g ...