【DP】饥饿的牛

来源:互联网 发布:中国域名管理机构 编辑:程序博客网 时间:2024/06/09 23:38
 饥饿的牛

源程序名   HUNGER.??? (PAS,C,CPP)

可执行文件名   HUNGER.EXE

输入文件名   HUNGER.IN

输出文件名     HUNGER.OUT 

牛在饲料槽前排好了队。饲料槽依次用1到N(1<=N<=2000)编号。每天晚上,一头幸运的牛根据约翰的规则,吃其中一些槽里的饲料。

    约翰提供B个区间的清单。一个区间是一对整数start-end,1<=start<=end<=N,表示一些连续的饲料槽,比如1-3,7-8,3-4等等。牛可以任意选择区间,但是牛选择的区间不能有重叠。

当然,牛希望自己能够吃得越多越好。给出一些区间,帮助这只牛找一些区间,使它能吃到最多的东西。

在上面的例子中,1-3和3-4是重叠的;聪明的牛选择{1-3,7-8},这样可以吃到5个槽里的东西。 

输入

第一行,整数B(1<=B<=1000)

第2到B+1行,每行两个整数,表示一个区间,较小的端点在前面。 

输出

仅一个整数,表示最多能吃到多少个槽里的食物。 

样例

HUNGER.IN

3

1 3

7 8

3 4 

HUNGER.OUT

5

=================================

=====================================

type  node=record         s,e:longint;       end;var  b:longint;  a:array[1..2000]of node;  f:array[0..2000]of longint;procedure init;begin  assign(input,'hunger.in');  assign(output,'hunger.out');  reset(input); rewrite(output);end;procedure terminate;begin  close(input); close(output);  halt;end;procedure qsort(s,t:longint);var  i,j:longint;  x:node;  tem:node;begin  i:=s; j:=t;  x:=a[(s+t)shr 1];  repeat    while x.e<a[j].e do dec(j);    while a[i].e<x.e do inc(i);    if i<=j then      begin        tem:=a[i]; a[i]:=a[j]; a[j]:=tem;        inc(i); dec(j);      end;  until i>j;  if i<t then qsort(i,t);  if s<j then qsort(s,j);end;function max(a,b:longint):longint;begin  if a>b then exit(a);  exit(b);end;procedure main;var  i,j:longint;  ans:longint;begin  readln(b);  for i:=1 to b do    readln(a[i].s,a[i].e);  qsort(1,b);  fillchar(f,sizeof(f),0);  ans:=0;  for i:=1 to b do    for j:=a[i].s-1 downto 0 do    begin      f[a[i].e]:=max(f[a[i].e],f[j]+(a[i].e-a[i].s+1));      if ans<f[a[i].e] then ans:=f[a[i].e];    end;  writeln(ans);end;begin  init;  main;  terminate;end.