PASCAL中合并石子问题

来源:百度知道 编辑:UC知道 时间:2024/06/25 08:43:55
N堆石子,每次只能2合1,且N个石子耗费N体力,问将N堆石子合并为一堆耗费多少体力?

不相邻:huffman树 每次取最小两个合并
相邻:动态规划
f[i,j]表示从i到j所费最小体力
f[i,j]=f[i,k]+f[k+1,j]+s[i,j] (i<=k<j)
实现时候要注意先后问题

没描述清楚吧?
是最少耗费多少体力的话只要每次把最小的两堆合并就可以了。

只能相邻合并吧

http://hi.baidu.com/smile198793/blog/item/efcbe750aaff21581138c243.html

program df;
var a:array [1..10000] of longint;
i,j,temp,p,k,n,s:longint;

procedure kp(l,r:longint);
var x,i,j,t:longint;
begin
x:=a[(l+r) div 2];
i:=l;j:=r;
repeat
while a[i]<x do inc(i);
while a[j]>x do dec(j);
if i<=j then
begin
t:=a[i]; a[i]:=a[j]; a[j]:=t;
inc(i);dec(j);
end;
until i>j;
if l<j then kp(l,j);
if i<r then kp(i,r);
end;

begin
readln(n);
for i:=1 to n do
read(a[i]);

kp(1,n);

s:=0;