1.链式归并
问题描述
设有N堆沙子排成一排,其编号为1,2,3,…,N(N<=100)。每堆沙子有一定的数量。现要将N堆沙子并成为一堆。归并的过程只能每次将相邻的两堆沙子堆成一堆,这样经过N-1次归并后成为一堆。找出一种合理的归并方法,使总的代价最小。
【输入格式】
输入由若干行组成,第一行有一个整数,n(1≤n≤100);表示沙子堆数。第2至m+1行是每堆沙子的数量。
【输出格式】
一个整数,归并的最小代价。
【输入样例】
输入文件名:shizi.in
7
13
7
8
16
21
4
18
【输出样例】
输出文件名:shizi.out
239
令f[i,j]表示归并第i个数到第j数的最小代价,sum[i,j]表示第i个数到第j个数的和,这个可以事先计算出来。sum[i,j]可以在O(1)的时间内算出.
容易的到以下的动态转移方程:
阶段:以归并石子的长度为阶段,一共有n-1个阶段。
状态:每个阶段有多少堆石子要归并,当归并长度为2时,有n-1个状态;
当归并长度为3时,有n-2个状态;
当归并长度为n时,有1个状态。
决策:当归并长度为2时,有1个决策;当归并长度为3时,有2个决策;
当归并长度为n时,有n-1个决策。
[算法优化]
见 http://it.dgzx.net/drkt/oszt/zltk/yxlw/dongtai3.htm
优化后,无非加了一个s[i,j] 记录i...j之间f[i,j]为最优状态的分割点
2.
环型石子合并
问题描述
在一个圆形操场的四周摆放着n堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。
试设计一个算法,计算出将n堆石子合并成一堆的最小得分和最大得分。
输入文件
输入文件stone.in包含两行,第1行是正整数n(1≤n≤100),表示有n堆石子。第2行有n个整数,分别表示每堆石子的个数。
输出文件
输出文件stone.out 包含两行,第1行中的数是最小得分;第2行中的数是最大得分。
输入样例
4
4 4 5 9
输出样例
43
54
来源:CSDN
作者:Rachel-Zhang
链接:https://blog.csdn.net/abcjennifer/article/details/5805330