阶梯教室的利用(DP)

阶梯教室设备利用
我们现有许多演讲要在阶梯教室中举行。每一个演讲都可以用唯一的起始和终止时间来确定,
如果两个演讲时间有部分或全部重复,那么它们是无法同时在阶级教室中举行的。现在我们想要尽
最大可能的利用这个教室,也就是说,我们需要在这些演讲中选择一些不重复的演讲来举行使得他们用的总时间尽可能的长。
我们假设在某一演讲结束的瞬间我们就可以立即开始另一个演讲。
任务:
请写一个程序:
? 在文本文件REZ.IN中读入所有演讲的起始和终止时间;
? 计算最大的可能演讲总时间;
? 把结果输出到文本文件REZ.OUT中。

Input

第一行包括一个正整数n,n ? 10000,为所有的演讲的数目。
以下的n行每行含有两个由空格隔开整数p和k,0 <= p < k<= 30000。
这样的一对整数表示一个演讲由时间p开始到时间k结束。
输出格式:

Output

输出唯一的一个整数,为最长的演讲总时间。 


这类比较常见直接模版就好了,我是直接建边DP的,收第I分钟的状态可以直接由第I-1分钟的状态转移过来,然后就是个一个类似于TREE DP

的转移了,因为每个演讲可以在上个演讲结束后立即进行所以有:F[I]=MAX(F[SON[P]]+I-SON[P]);


CODE:

var
  now,f:array[0..30000] of longint;
  pre,son:array[0..10000] of longint;
  n,tot,r:longint;

  function max(a,b:longint):longint;
  begin if a>b then  exit(a); exit(b); end;

  procedure add(a,b:longint);
  begin
    inc(tot);  pre[tot]:=now[a]; now[a]:=tot; son[tot]:=b;
  end;

  procedure init;
  var i,j,k,p,a,b:longint;
  begin
    readln(n); r:=0;
    for i:=1 to n do
    begin
     readln(a,b);
     add(b,a);
     r:=max(r,b);
    end;

    for i:=1 to r do
    begin
      f[i]:=f[i-1];
      p:=now[i];
      while p>0 do
      begin
       f[i]:=max(f[i],f[son[p]]+i-son[p]);
       p:=pre[p];
      end;
    end;
    writeln(f[r]);
  end;

begin
 init;
end.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值