当前课程知识点:程序设计基础 >  第六章 递推与动态规划 >  6.3 橱窗的插花问题 >  6.3.5.2 采用动态规划算法—递推代码

返回《程序设计基础》慕课在线视频课程列表

6.3.5.2 采用动态规划算法—递推代码在线视频

6.3.5.2 采用动态规划算法—递推代码

下一节:6.3.5.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.1.1 什么是程序?什么是语言?

--1.1.2 什么是程序设计?

--1.1.3 计算机发展史

-1.2 买菜问题

--1.2.1 问题描述

--1.2.2 程序的基本结构

-1.3 数学运算

--1.3.1 数学运算符

--1.3.2 数学函数

-1.4 补充说明

--1.4.1 编程环境的下载与安装

--1.4.2 程序基本结构中的含义

--1.4.3 格式与风格

-1.5 总结

--1.5 总结

-程设论道

--程设论道

-师生问答

--师生问答一:怎样学好程序设计

--师生问答二:语言选择

--师生问答三:关于函数

-第一章 编程初步--语法自测

第二章 变量与代数思维

-2.1 关于超级计算器的几点思考

--2.1.1 关于超级计算器的几点思考

-2.2 电子秤模拟 — 背景介绍及需求分析

--2.2.1 电子秤模拟 — 背景介绍及需求分析

-2.3 电子秤模拟 — 代码实现

--2.3.1 电子秤模拟 — 代码实现

-2.4 变量定义与变量类型

--2.4.1 变量定义与变量类型

-2.5 猜数游戏与数据表示

--2.5.1 猜数游戏与数据表示

-2.6 关于变量的讨论

--2.6.1 变量的初始值

--2.6.2 变量类型

--2.6.3 变量内存单元地址

--2.6.4 存“变量地址”的变量——指针

--2.6.5 指针的 读/写 操作

--2.6.6 指针的 加/减 操作

--公告

-2.7 变量体现的计算思维

--2.7.1 变量体现的计算思维

-程设论道

--程设论道

-师生问答

--师生问答

-第二章 变量与代数思维--语法自测

第三章 逻辑推理与枚举解题

-3.1 谁做的好事——语义表示

--3.1.1 谁做的好事——语义表示

-3.2 谁做的好事——真假检查

--3.2.1 谁做的好事——真假检查

-3.3 谁做的好事——循环枚举

--3.3.1 谁做的好事——循环枚举

-3.4 谁是嫌疑犯——多重循环枚举

--3.4.1 谁是嫌疑犯——多重循环枚举

-3.5 谁是嫌疑犯——破案线索表示

--3.5.1 谁是嫌疑犯——破案线索表示

-3.6 谁是嫌疑犯——用二进制枚举

--3.6.1 谁是嫌疑犯——用二进制枚举

-程设论道

--程设论道一

--程设论道二

--程设论道三

-师生问答

--师生问答一:字符与ASCII码表

--师生问答二:其他循环语句、运算符优先级与变量作用域

-第三章 逻辑推理与枚举解题--语法自测

第四章 筛法与查找

-4.1 插花游戏

--4.1.1 问题提出(求素数)

--4.1.2 函数初探

--4.1.3 运行演示

-4.2 筛法

--4.2.1 筛法思路

--4.2.2 数组的定义

--4.2.3 代码翻译

--4.2.4 运行演示

--4.2.5 小朋友数人数

--4.2.6 运行演示

--4.2.7 韩信点兵

-4.3 线性查找

--4.3.1 扑克查找问题

--4.3.2 扑克查找问题代码翻译

--4.3.3 最小值问题

--4.3.4 最小值问题代码翻译

-4.4 折半查找

--4.4.1 提问

--4.4.2 折半查找思路

--4.4.3 折半查找代码翻译

--4.4.4 折半查找运行演示

-4.5 排序问题

--4.5.1 插入排序

--4.5.2 选择排序

--4.5.3 函数写法

--4.5.4 运行演示

-4.6 总结

--4.6.1 总结

-程设论道

--程设论道一:数组与编码思维

--程设论道二:筛法

-师生问答

--师生问答一:函数与面向过程编程

--师生问答二:数组的下标越界

-第四章 筛法与查找--语法自测

第五章 分治思想与递归

-5.1 阶乘

--5.1.1 阶乘问题

--5.1.2 递归解法

--5.1.3 递归小结

-5.2 排序

--5.2.1 归并排序——总体思路

--5.2.2 归并排序——思路分解

--5.2.3 归并排序——代码解说

--5.2.4 快速排序——总体思路

--5.2.5 快速排序——代码解说

--5.2.6 排序总结

-5.3 矩阵填充

--5.3.1 矩阵填充问题

--5.3.2 代码解说

-5.4 分书与八皇后

--5.4.1 问题描述

--5.4.2 问题分析——共性

--5.4.3 问题分析——区别

--5.4.4 解题准备——二维数组

--5.4.5 解题准备——递归设计

--5.4.6 代码解说——分书问题

--5.4.7 代码解说——八皇后问题

-5.5 青蛙过河

--5.5.1 问题描述

--5.5.2 问题分析——简单情况

--5.5.3 问题分析——复杂情况

--5.5.4 问题分析——一般情况

-程设论道

--程设论道一

--程设论道二

-师生问答

--师生问答一

--师生问答二

-第五章 分治思想与递归--语法自测

第六章 递推与动态规划

-6.1 兔子数列问题

--6.1.1 问题描述

--6.1.2 按大小兔子分别递推

--6.1.3 按总数递推

--6.1.4 不用数组递推

-6.2 分鱼问题

--6.2.1 问题描述

--6.2.2 从A到E递推

--6.2.3 从E到A递推

-6.3 橱窗的插花问题

--6.3.1 问题描述

--6.3.2 题意理解与分析

--6.3.3 用枚举思想解题

--6.3.4 采用递推的优化算法

--6.3.5.1 采用动态规划算法—优化分析

--6.3.5.2 采用动态规划算法—递推代码

--6.3.5.3 采用动态规划算法—计算过程

--6.3.5.4 采用动态规划算法—输出方案

--6.3.6 动态规划总结

-6.4 最长公共子序列问题

--6.4.1 问题描述与理解

--6.4.2 问题分析

--6.4.3.1 动态规划解题(1)

--6.4.3.2 动态规划解题(2)

--6.4.3.3 动态规划代码

-程设论道

--程设论道一

--程设论道二

-师生问答

--师生问答

-第六章 递推与动态规划--语法自测

第七章 文本数据处理

-7.1 统计记录总数

--7.1.1 问题分析

--7.1.2 读文件操作

-7.2 统计活跃用户数

--7.2.1 问题分析

--7.2.2 字符串

--7.2.3 程序翻译与演示

-7.3 统计在线时长

--7.3.1 问题分析

--7.3.2 结构

--7.3.3 程序翻译与演示

--7.3.4 写文件操作

-7.4 总结

--7.4.1 总结

-程设论道

--程设论道

-师生问答

--师生问答

-第七章 文本数据处理--语法自测

第八章 非文本数据处理

-8.1 将数据组织成链表

--8.1.1 链表的基本概念

--8.1.2 代码讲解

--8.1.3 链表遍历与释放

-8.2 提高链表访问效率 —— 哈希链表

--8.2.1 简单的哈希算法

--8.2.2 算法实现

-8.3 以二进制文件存储链表

--8.3.1 二进制文件的操作方法

--8.3.2 代码讲解

-程设论道

--程设论道一

--程设论道二

-师生问答

--师生问答

-第八章 非文本数据处理--语法自测

第九章 可配置的程序设计

-9.1 自动售卖程序

--9.1.1 提出问题与初步设计

--9.1.2 细化实现订单处理

--9.1.3 使程序更健壮

-9.2 配制水果信息

--9.2.1 提出问题与设计文件格式

--9.2.2 实现订单处理功能

-9.3 指定界面语言

--9.3.1 提出问题与命令行参数

--9.3.2 实现程序功能

-程设论道

--程设论道

-师生问答

--师生问答

-第九章 可配置的程序设计--语法自测

6.3.5.2 采用动态规划算法—递推代码笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。