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

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

6.3.5.1 采用动态规划算法—优化分析在线视频

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

下一节:6.3.5.2 采用动态规划算法—递推代码

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

6.3.5.1 采用动态规划算法—优化分析课程教案、知识点、字幕

我们把枚举和递推相结合

得到了一个比单纯的枚举效率更高的一种算法

本着精益求精的态度

我们就问说这个方法还能进一步优化吗

如果我们说还能 那怎么优化呢

请大家来考虑这样的一种情况

前三个花瓶插两朵花

会怎么样呢

当然第一种情况是说

0号花 1号花分别插在0号1号花瓶里头

也就是我们前面用到了partial_sum的意图

那么对于前三个花瓶里头011这种方案呢

它的美感得分的和是7+21=28的

那么对于前三个花瓶插两朵花

第二种方法就是把1号也空着

这个时候呢 我们需要计算的是partial_sum[(101)]

那么根据我们查之前的那个美感表呢

它的部分的美感和是7+(-4)

我们简单的写也就是7-4了等于3

还有第三种方案

我把0号花瓶给空着

这个时候我们计算的是partial_sum[(110)]

查表可以知道它的美感得分是23-4=19

那么显然对于前三个花瓶插入两朵花的

这么一个局部的方案来说

最优的是第一种方案

就是美感得分是28这种方案

我们整个题目呢是要求说

所有的花插在花瓶里以后

那种方法是最优的

我们先不管所有的方案

那我们想如果一种方案

它的前三个花瓶呢就是插了两朵花

后面的花我还不太清楚插哪里

那我就在这个小范围内去找一个最优的

那显然我们是需要去计算这种情况的

那我不知道后面两个花瓶怎么插

我就打个问号

所以呢我们就去找求一个max

是那些可能值的max呢

就是后两个花瓶不知道怎么插

但是呢前面的花瓶有011 101和110三种方案

我需要去求这三类的方案中间的最优的一个

那么根据我们的partial_sum的递推的式子呢

其实我们可以去把它分解一下

就是已知的部分和呢是后面三个花瓶

也就是真的是011 101和110这三种方案

然后未知部分呢是剩余的花瓶两个问号

加上前面不插花的这么一个

我们暂时用partial_sum来表示

这个式子呢是可以进行一些化简的 这个我们都会

我们把max分到了每个数中间去

因为每一项都是两个之和

所以呢两个各取max以后再相加

也能和原来的结果一样的

那么这个时候我们就发现了

对于前面的011 101和110这个partial_sum来说呢

它的最大的值是第一种方案partial_sum[(011)]

那么后面呢他们是相同的项

所以呢max其实可以合并成一项

就是前三个花瓶不插花

然后呢后面的花瓶去插花

这里头我们找一个最优的就行了

那么根据这样的一个递推的式子呢

我们就可以想到说在计算过程中间

我们其实只需要计算

当然就要保存了

那些最佳的部分插花方案

那有些插花方案它不是最优的

不是部分最佳的

那完全就没有必要存

因为它必然不可能是最后的最优方案

所以呢我们刚才那个partial_sum递推方案公式呢

可以再改一改

我们只需要关注那些最优的

我们只要让最优的这么一种部分的插花方案呢

从1到2到V个花瓶这样逐渐的增大规模

然后一直去计算总是去计算它的最优方案

并且保持下来

这样呢最终我们应该也能够得到题目答案

程序设计基础课程列表:

第一章 编程初步

-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.1 采用动态规划算法—优化分析笔记与讨论

也许你还感兴趣的课程:

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