当前课程知识点:程序设计基础 > 第六章 递推与动态规划 > 6.3 橱窗的插花问题 > 6.3.5.2 采用动态规划算法—递推代码
那么我们再仔细想在递推过程中间
我之前的部分的最优方案已经知道了
那现在当我需要多考虑一个花瓶的时候
那显然有两种情况
这个花瓶插花或者这个花瓶不插花
那么这个问题呢
我们可以用这种图的方式更好的来向大家说明
大家请看这张的图
我们用一个大概坐标的方式来表示
横坐标呢我标上了m-1和m
表示说我到底有几个花瓶
纵坐标呢我们表示说我一共要插几朵花
那每一个交点上面
就表示了前几个花瓶插了几朵花
比如说最左下角的这么一个交点呢
就表示了一个partial是[m-1]个花瓶插[n-1]朵花
当然由于我们只保存那个最佳的一种方案
所以呢我们这改了一下叫best_partial
我们只找了一个最佳的部分的方案
对于左上角的这个交点
我们看到这个best_partial对应的是m-1个花瓶插n朵花
而右上呢当然就是m个花瓶插n朵花的最优的方案了
那么插花对于这张图意味着什么呢
我们就考虑这个best_partial [m][n]
如果这个新的花瓶
也就是第m花瓶是要插花的
那也就说明一共n朵花里头
最后一朵花插在这个花瓶上的
那么前面的m-1个花瓶自然就插了n-1朵花
而且呢这第n朵花插在这个花瓶上
会得到一个美感值
也就是beauty[m-1][n-1]
所以对于best_partial[m][n]来说呢
它的美感的得分和
应该是m-1 n-1这个位置上的美感得分和
加上了插序花的这个美感值
我们写成递推公式是这样的
如果这个新的花瓶
也就是第m花瓶不插花
那么显然一共n朵花只能插在第m-1个花瓶里头了
那我们用图上的这么一个横向的箭头来表示
那么由于没有插入新的花
所以呢它的美感得分和不会增加
还是在原来在m-1 n这个位置上的美感得分和
把两种情况综合考虑
当我在进行递推的计算
第前m个花瓶插n朵花的美感得分和的时候
那么实际上我是考虑两种情况
并且呢我找一个最优的
因此我们best_partial的递推公式呢是求两种情况的max
我们有了递推公式之后呢
再想一下它的初始值
那显然初始值就是说不管你有多少个花瓶
我如果不插花那肯定美感得分和0
所以这就是我们的初始值
我们初始值有若干个
一个花瓶不插花是0
两个花瓶不插花也是0有若干个
所以给予这些想法
那我们就可以大概去规划我们的代码了
所以我们要先定义一个best_partial这么一个数组
那为了考虑问题方便呢我们想
花呢可以从不插花到插这朵F朵花
那花瓶呢我们也是从一个花瓶也不算到for的V个花瓶
我们这个数组的整个数量[V+1][F+1]
并且我们这就顺手赋初值了
那这个二维数组赋初值的这个方法呢
我们前面课程中间已经学过了
大家如果还不太熟悉呢可以再去复习一下
然后就进入我们的递推过程
根据我们刚才的这种分析
我们考虑说花瓶逐步增多
那么对于若干个或者m个花瓶来说
这个插n朵花怎么考虑呢
我们显然是 刚才说了有一个max
在代码里头怎么写max呢
我们现在就不是说if这个大于那个就等于怎么样
我们现在简单的换成这个写法
我们先假设插花的方案是最优的
先计算一下best_partial等于这个递推公式
然后呢我们再考虑说
如果这个新的花瓶不插花
也就是它的部分得分和等于
前面m-1个花瓶加n朵花的得分和
我们看到底哪一个和最大
那如果不插花更优的话呢
我们就把best_partial再重新设置为
不插花的这种状态
那大家请注意一下有一个n 那这个也很好理解 如果前四个花瓶插四朵花 那必须每个花瓶都插上 所以呢我们这必须要有一个判断n是要小于m的
-1.1 基础知识
-1.2 买菜问题
-1.3 数学运算
-1.4 补充说明
-1.5 总结
--1.5 总结
-程设论道
--程设论道
-师生问答
-第一章 编程初步--语法自测
-2.1 关于超级计算器的几点思考
-2.2 电子秤模拟 — 背景介绍及需求分析
-2.3 电子秤模拟 — 代码实现
-2.4 变量定义与变量类型
-2.5 猜数游戏与数据表示
-2.6 关于变量的讨论
--公告
-2.7 变量体现的计算思维
-程设论道
--程设论道
-师生问答
--师生问答
-第二章 变量与代数思维--语法自测
-3.1 谁做的好事——语义表示
-3.2 谁做的好事——真假检查
-3.3 谁做的好事——循环枚举
-3.4 谁是嫌疑犯——多重循环枚举
-3.5 谁是嫌疑犯——破案线索表示
-3.6 谁是嫌疑犯——用二进制枚举
-程设论道
--程设论道一
--程设论道二
--程设论道三
-师生问答
-第三章 逻辑推理与枚举解题--语法自测
-4.1 插花游戏
-4.2 筛法
-4.3 线性查找
-4.4 折半查找
--4.4.1 提问
-4.5 排序问题
-4.6 总结
--4.6.1 总结
-程设论道
--程设论道二:筛法
-师生问答
-第四章 筛法与查找--语法自测
-5.1 阶乘
-5.2 排序
-5.3 矩阵填充
-5.4 分书与八皇后
-5.5 青蛙过河
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答一
--师生问答二
-第五章 分治思想与递归--语法自测
-6.1 兔子数列问题
-6.2 分鱼问题
-6.3 橱窗的插花问题
-6.4 最长公共子序列问题
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答
-第六章 递推与动态规划--语法自测
-7.1 统计记录总数
-7.2 统计活跃用户数
-7.3 统计在线时长
--7.3.2 结构
-7.4 总结
--7.4.1 总结
-程设论道
--程设论道
-师生问答
--师生问答
-第七章 文本数据处理--语法自测
-8.1 将数据组织成链表
-8.2 提高链表访问效率 —— 哈希链表
-8.3 以二进制文件存储链表
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答
-第八章 非文本数据处理--语法自测
-9.1 自动售卖程序
-9.2 配制水果信息
-9.3 指定界面语言
-程设论道
--程设论道
-师生问答
--师生问答
-第九章 可配置的程序设计--语法自测