【SSLGZ 2081】书本整理

来源:互联网 发布:淘宝拍照用什么相机好 编辑:程序博客网 时间:2024/04/27 13:34

问题描述
小明的书架上放了许多书,为了使书架变得整洁,小明决定整理书架,他将所有书按高度大小排列,这样排了之后虽然整齐了许多,但小明发现,书本的宽度不同,导致书架看上去还是有些凌乱。小明把这个凌乱值定义为相邻两本书的宽度差的绝对值的和。
例如有4本书:
1x2
5x3
2x4
3x1
那么小明将其排列整齐后的顺序是:
1x2
2x4
3x1
5x3
凌乱值就是2+3+2=7
于是小明决定拿掉其中的k本书,使凌乱值最小,你能帮他求出这个最小值吗?
已知每本书的高度都不一样。
样例输入
4 1 //高、宽
1 2
5 3
2 4
3 1
样例输出
3
算法讨论
本题使用动态规划,定义f[i,j]为前i本书只放j本的凌乱值,则:
f[i,j]:=min{f[i,j],f[l,j-1]+abs(a[l,2]-a[i,2])} j-1<=l<=i-1

const  maxn=101;var  a:array[1..maxn,1..2] of longint;  f:array[1..maxn,1..maxn] of longint;  i,j,l,n,k,t,m:longint;function min(x,y:longint):longint;begin  if x<y    then exit(x)    else exit(y)end;begin  read(n,k);  for i:=1 to n do    read(a[i,1],a[i,2]);  for i:=1 to n-1 do    for j:=i+1 to n do      if a[i,1]>a[j,1]        then begin               t:=a[i,1]; a[i,1]:=a[j,1]; a[j,1]:=t;               t:=a[i,2]; a[i,2]:=a[j,2]; a[j,2]:=t             end;  for i:=2 to n do    for j:=2 to n-k do      f[i,j]:=maxlongint;  for i:=2 to n do    for j:=2 to n-k do      begin        if j>i          then break;        for l:=j-1 to i-1 do          f[i,j]:=min(f[i,j],f[l,j-1]+abs(a[l,2]-a[i,2]))      end;  m:=maxlongint;  for i:=n-k to n do    m:=min(m,f[i,n-k]);  write(m)end.

这里写图片描述
Pixiv ID:58663595

0 0