区域动态规划
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题19。
石子合并--NOI1995 stone.pas/stone.cpp/stone.c/stone.exe
有n堆石子围成一个圆圈。
现在需要把它们合并成一堆石子。
每次合并时,
只能合并相邻的两堆石子,所耗力气为两堆石子重量之和,合并得到的新堆的重量为原两堆重量之和。
输入文件stone.in中:第一行一个整数n,第二行n个整数,表示顺序排列的每堆石子的重量。
输出文件stone.out中:只有一行,该行只有一个整数,表示合并这n堆石子最少需要耗费的力气。
数据规模:1<=n<=200,合并n堆石子最少需要耗费的力气不超过2*109。
样例输入;
3
1 3 5
样例输出:
13
动态规划一般解题步骤:罗列问题阶段——〉构造状态描述——〉转移方程确立——〉选取初值——〉
以如下为例
5
1 3 5 4 2
问题阶段:
顺向分析
每次的合并就是问题阶段的分水岭罗列问题阶段:
f[?,1]
所有由1次合并得来的石子堆
f[?,2]
所有由2次合并得来的石子堆
所有由3次合并得来的石子堆
……
f[?,5]
所有由n-1次合并得来的石子堆构造状态描述
目标状态
一般形式的状态f[1,5]
f[I,j]f[2,5]
合并从i开始的j堆石子需要耗费的最小力f[3,5]f[I,5]还有其他描述方式吗?
转化
最后一次合并的四种方式
f[4,5]
f[5,5]
转移方程确立
f[I,j]=min{f[I,p]+f[i+p,j-p]+a[I,j]}选取初值
模拟问题阶段,结合样例数据
所求为f[1,3],f[2,3],f[3,3]
根据相似性,求f[1,3]为例
f[1,1]+f[2,2]
f[1,2]+f[3,1]
再求f[1,2]
f[1,1]+f[2,1]
f[1,1]需要知道,根据描述即为0
f[I,1]即为0
算符范围确立
f[I,j]=min{f[I,p]+f[i+p,j-p]+a[I,j]}(1<=p<=j-1)
思考
能有另外的状态描述吗?
堆重量之和。
问最少需要耗费多少力气?
石子的重量。
需要耗费的力气。
——〉选取初值——〉算符范围确立——〉时间空间估算
1 3 5 4
2 1
3 5 4
for i:=2 to n do
for i1:=1 to 2n-i
for p:=I downto
f[?,1]=a[i]
b[I,j]=sum[j]-sum[i-1]
石子需要耗费的最小力气。