第九章动态规划第一节动态规划的基本模型第二节动态规划与递推第三节背包问题第四节动态规划经典题动态规划程序设计是对解最优化问题的一种途径、一种方法,而不是一种特殊算法
不象前面所述的那些搜索或数值计算那样,具有一个标准的数学表达式和明确清晰的解题方法
动态规划程序设计往往是针对一种最优化问题,由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的设计方法对不同的问题,有各具特色的解题方法,而不存在一种万能的动态规划算法,可以解决各类最优化问题
因此读者在学习时,除了要对基本概念和方法正确理解外,必须具体问题具体分析处理,以丰富的想象力去建立模型,用创造性的技巧去求解
我们也可以通过对若干有代表性的问题的动态规划算法进行分析、讨论,逐渐学会并掌握这一设计方法
第四节动态规划经典题【例9-18】、合并石子【问题描述】在一个操场上一排地摆放着N堆石子
现要将石子有次序地合并成一堆
规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分
【编程任务】试设计一个程序,计算出将N堆石子合并成一堆的最小得分
【输入格式】第一行为一个正整数N(2≤N≤100);以下N行,每行一个正整数,小于10000,分别表示第i堆石子的个数(1≤i≤N)
【输出格式】为一个正整数,即最小得分
s[i]表示前i堆石头的价值总和,f[i][j]表示把第i堆到第j堆的石头合并成一堆的最优值
for(i=n;i>=1;i--)for(j=i+1;jb)returnb;elsereturna;}intf[101][101];ints[101];intn,i,j,k,x;intmain(){scanf("%d",&n);for(i=1;i