您的位置:首页 > 其它

石子合并问题

2007-07-11 18:45 330 查看
问题:

在一个园形操场的四周摆放N堆石子(N≤100),现要将石子有次序地合并成一堆。规定
每次只能选相邻的两堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。
编一程序,由文件读入堆数N及每堆的石子数(≤20),
①选择一种合并石子的方案,使得做N-1次合并,得分的总和最小;
②选择一种合并石子的方案,使得做N-1次合并,得分的总和最大。

今天在网上看到了这道题,觉得跟我们系去年的算法比赛的一道题很像,仔细看完题以后才发现原来区别还是很大的。那道题跟这道题最大的差别在于没有要求必须选择相邻的两堆,所以用贪心+最大(小)堆就可以搞定了。

f(i,j)表示从i起共合并j堆的最大(小)得分,通过分析可知该问题具有动态规划所要求的两个性质:

1 最优子结构性质

如果f(i,j)是从i起的共j个堆的最大(小)得分,那必定存在k(i<=k<=j),使得f(i,k)和f(i+k,j-k)的得分分别是是最大(小)的。

2 重叠子问题性质

计算f(i,j) 时可以利用已经计算的结果简化计算步骤。

f(i,j)=max{f(i,k)+f(i+k,j-k)}最后从f(1,n),f(2,n)……f(n,n)中选出值最小的一个即是该问题的解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: