poj2430

来源:互联网 发布:海关数据是否有用 编辑:程序博客网 时间:2024/05/19 18:43

【题意】

有n头牛在2*b的牧场上,只可以修建k(k<=n)个矩形牛棚,牛棚之间不能有重叠的部分,求牛棚的最小面积

【输入】

第一行n、k、b

【输出】

最小面积


状压dp

离散一下,用0~3表示这一列的状态

然后dp,f[i][j][k]表示第i列用了j个牛棚,状态为k的最小面积

k分为0~4,表示

0:什么也没有

1:上面一格被覆盖

2:下面一个被覆盖

3:两格被同一个矩形覆盖

4:两格被不同的矩形覆盖


program poj2430;var  inf,tot,n,k,b,i,j:longint;  st,x,y,p:array [0..1001] of longint;  f:array [0..1001,0..1001,0..4] of longint;  mini:array [0..1001,0..1001] of longint;procedure swap (var a,b:longint);inline;begin  if a=b then exit;  b:=a xor b;  a:=a xor b;  b:=a xor b;end;function min (a,b,c,d:longint):longint;inline;var  ans:longint;begin  ans:=a;  if b<ans then ans:=b;  if c<ans then ans:=c;  if d<ans then ans:=d;  exit(ans);end;procedure qsort (s,e:longint);var  i,j,q,p:longint;begin  if s>=e then exit;  i:=s;  j:=e;  q:=x[(s+e) div 2];  p:=y[(s+e) div 2];  while i<=j do    begin      while (y[i]<p)or((y[i]=p)and(x[i]<q)) do inc(i);      while (y[j]>p)or((y[j]=p)and(x[j]>q)) do dec(j);      if i>j then break;      swap(x[i],x[j]);      swap(y[i],y[j]);      inc(i);      dec(j);    end;  qsort(s,j);  qsort(i,e);end;begin  read(n,k,b);  for i:=1 to n do    read(x[i],y[i]);  qsort(1,n);  tot:=0;  i:=1;  while i<=n do    if y[i]=y[i+1] then      begin        inc(tot);        st[tot]:=3;        p[tot]:=y[i];        i:=i+2      end                   else      begin        inc(tot);        st[tot]:=1 shl (x[i]-1);        p[tot]:=y[i];        inc(i);      end;  fillchar(f,sizeof(f),32);  fillchar(mini,sizeof(mini),32);  inf:=f[0,0,0];  f[0,0,0]:=0;  mini[0,0]:=0;  p[0]:=-inf;  for i:=1 to tot do    for j:=1 to tot do      case st[i] of        1:begin            f[i,j,1]:=min(f[i,j,1],            f[i-1,j,1]+p[i]-p[i-1],            f[i-1,j,4]+p[i]-p[i-1],            mini[i-1,j-1]+1);            f[i,j,3]:=min(f[i,j,3],            f[i-1,j,3]+2*(p[i]-p[i-1]),            mini[i-1,j-1]+2,            inf);            if j>1 then            f[i,j,4]:=mini[i-1,j-2]+2;            f[i,j,4]:=min(f[i,j,4],            f[i-1,j,4]+2*(p[i]-p[i-1]),            f[i-1,j-1,1]+(p[i]-p[i-1])+1,            f[i-1,j-1,2]+(p[i]-p[i-1])+1);            mini[i,j]:=min(f[i,j,1],            f[i,j,2],            f[i,j,3],            f[i,j,4]);          end;        2:begin            f[i,j,2]:=min(f[i,j,2],            f[i-1,j,2]+p[i]-p[i-1],            f[i-1,j,4]+p[i]-p[i-1],            mini[i-1,j-1]+1);            f[i,j,3]:=min(f[i,j,3],            f[i-1,j,3]+2*(p[i]-p[i-1]),            mini[i-1,j-1]+2,            inf);            if j>1 then            f[i,j,4]:=mini[i-1,j-2]+2;            f[i,j,4]:=min(f[i,j,4],            f[i-1,j,4]+2*(p[i]-p[i-1]),            f[i-1,j-1,1]+p[i]-p[i-1]+1,            f[i-1,j-1,2]+p[i]-p[i-1]+1);            mini[i,j]:=min(f[i,j,1],            f[i,j,2],            f[i,j,3],            f[i,j,4]);          end;        3:begin            f[i,j,3]:=min(f[i,j,3],            mini[i-1,j-1]+2,            f[i-1,j,3]+2*(p[i]-p[i-1]),            inf);            if j>1 then            f[i,j,4]:=mini[i-1,j-2]+2;            f[i,j,4]:=min(f[i,j,4],            f[i-1,j,4]+2*(p[i]-p[i-1]),            f[i-1,j-1,1]+p[i]-p[i-1]+1,            f[i-1,j-1,2]+p[i]-p[i-1]+1);            mini[i,j]:=min(f[i,j,1],            f[i,j,2],            f[i,j,3],            f[i,j,4]);          end;      end;  writeln(min(  f[tot,k,1],  f[tot,k,2],  f[tot,k,3],  f[tot,k,4]));end.