【题意】
有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.