问题描述
小明的书架上放了许多书,为了使书架变得整洁,小明决定整理书架,他将所有书按高度大小排列,这样排了之后虽然整齐了许多,但小明发现,书本的宽度不同,导致书架看上去还是有些凌乱。小明把这个凌乱值定义为相邻两本书的宽度差的绝对值的和。
例如有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
本文探讨了一个有趣的书架整理问题,通过定义凌乱值并利用动态规划算法找到移除k本书后使得书架看起来最整洁的方法。文章提供了一个具体的实现方案。
515

被折叠的 条评论
为什么被折叠?



