当前课程知识点:程序设计基础 >  第五章 分治思想与递归 >  5.5 青蛙过河 >  5.5.3 问题分析——复杂情况

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

5.5.3 问题分析——复杂情况在线视频

5.5.3 问题分析——复杂情况

下一节:5.5.4 问题分析——一般情况

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

5.5.3 问题分析——复杂情况课程教案、知识点、字幕

刚才没有柱子确实是太简单了

我们现在要退到一般的情形

有柱子了所以我们要考虑的是Jump(s,y)

那么还是先看最简单的情形

尽管有柱子我们也看简单的

那当然是一根柱子

一根柱子有多少片荷叶呢

我们暂时还是让它只有一片荷叶

所以呢 s=1 y=1

那这个时候我们可以从图上看到

L R 一片荷叶 一根柱子

那怎么跳呢

大家想一想

在小溪当中的柱子 根据题目的要求

是可以多只青蛙摞起来的

很显然 如果让1号青蛙直接奔着S去是很亏的

所以应该是1号往Y荷叶上跳

如果你说我怎么想到这个呢

我们可以利用第三章所学的枚举思想

你想一想 青蛙最开始都在L柱子上

它们有哪些地方可以去呢

不就三个地方吗

中间的柱子S 中间的荷叶Y 右边的柱子

就三个地方 依次去就看直接第一只青蛙该往哪跳

你说往右边柱子上跳 完了跳过去这个题目就终了

只能跳过去一只青蛙

你说往这个s柱子跳

那跳完了上面也不能再落了

因为这是最小号的青蛙啊

所以我们第一只青蛙应该是蹦到y上去

你这么一想不就是想出来了吗

所以再复杂的问题 哪怕是感觉复杂

你也应该想到以前学过的知识是不是可以拿来用呢

用一个枚举法用一个穷举把所有可能性依次考虑一遍

很快就能得到一个答案

1号青蛙跳到荷叶y上

那么2号青蛙以此类推

跳荷叶 不允许

跳右边的柱子R 好像也不太对

所以2号青蛙跳到S柱子上去

都是用这种枚举 把所有可能性都考虑进来

一一比较 最后得到该怎么跳

这也是一个比较容易运用的思想 我们上一节已经学过

2号青蛙到了S柱子 3号青蛙到哪里去呢

3号青蛙 那么它可以蹦到R上面去

那么有没有别都办法呢

注意 因为这个时候在小溪的Y上面

已经有只青蛙了 所以这个时候下一步

并不见得只能是L上到青蛙去做动作

可以是Y上面的青蛙 可以是S上面的青蛙

去做动作 所以又有三种可能性

那我们到底该怎么办呢

我们想一想 我们发现

S上的青蛙如果走的话 不太好

所以我们可以把Y上面的青蛙给腾出来

也就是说 Y上面那只小青蛙可以蹦到S上去 摞起来

那这样的话 S柱子就摞了两只青蛙

这个时候Y空了

按照我们之前的想法

青蛙3号有哪些去处呢

S柱子显然是不行了 因为它的号大

Y是可以的 右边的R也是可以的

到底要不要蹦到R上去呢

根据题目要求

一旦蹦过去 那就过去三只青蛙

它是最大的 摞在最底下

因此 根据前面讲过的思路

3号青蛙蹦到荷叶Y上去是合适的

3号青蛙就到荷叶上去了

4号青蛙就冒出来了

那他没有别的地方可以去

荷叶上落不上脚 小溪的柱子上s也落不上脚

4号青蛙直接从L蹦到R上去

那其实问题答案已经出来了

5号青蛙不可能过去 按照题目的要求一个摞一个

它比谁都大

Y上面是一个3号青蛙

S这一根柱子上面上面落了两只青蛙 1号跟2号

所以5号过不去

所以实际上当4号过到R上去的时候

问题已经到此为止啦

剩下的步骤只是要把小溪当中荷叶和柱子上的3只青蛙

怎么弄到R上面去

这个就比较简单 只需要依次往上蹦就可以了

不过呢 你发现当3号青蛙从荷叶蹦到右边R上面

的4号青蛙之上之后

这个柱子上的1号和2号青蛙

还不能一次性地蹦到右边的柱子上去

不过好在荷叶已经空出来了

所以这个时候我们要再次使用荷叶

要把S这个柱子作为出发点

让青蛙蹦到荷叶上去

然后最后到R这个柱子上去

所以 1号青蛙蹦荷叶 2号青蛙蹦到R柱子

最后1号青蛙从荷叶蹦到右边的柱子上去

所以这个时候我们可以看到在分析的过程中

在S柱子上面 中间状态时候

我们发现 它有1号青蛙和2号青蛙

在借助荷叶转移过去的时候 里头摞了两只青蛙

而此时此刻

右边的柱子 荷叶上的青蛙刚刚蹦过去

我们那上面也落着两个青蛙

这个时候一眼看过去

你就感觉好像是那两个柱子一共摞了4只青蛙

好像是两个小队一样 分为两部分

把原来L柱子上的1234号青蛙拦腰截断

分成两组 一组到了小溪当中的柱子上去

一组到了右边的R柱子上去

这样的过程实际上是一分为二的过程

也就是将L上的青蛙分成两队

这四只青蛙是怎么过去的呢

好像是分成了两组 4只青蛙每组两只

先把上面的一组送到S上去

再把剩下的一组送到R上去

这样呢我们就可以考虑

有荷叶一片 有柱子一根

以及L跟R这4个物体

实际上可以把它分成两个系统 两个区域

这是问题的关键

把它分成两个区域

第一个区域是为了把3号4号挪到右边的R上

还有个区域是把1号2号挪到S柱子上去

而我们刚才挪到S柱子上的时候

实际上利用了Y这个荷叶

大家想一想那个1号2号怎么过去的

2号先蹦过去 1号蹦荷叶 2号蹦S柱子

然后再把1号从荷叶蹦到S柱子上去

是这么一个过程

所以L和荷叶Y 和柱子S他们整个是一个整体

然后前面3号跟4号是蹦到R上面去

怎么过去的呢 是经过L Y R过去的

另外 1号2号怎么过到R上去呢

它又是借助Y这个荷叶 也就是S Y R又是一个过去的

那么我们可以画一个图

最开始L Y S一起运过一批青蛙到S上面去

第二个圈是L Y R 把3号4号运过去

最后我们发现1号2号到R上面去

是S Y R来过去的

也就是 L Y S作为一个整体

完成了上一半青蛙的转移

而L Y R完成了把L上面的下一半青蛙

挪到R上去这样一个任务

那么S Y R完成了把以前挪到S上面那一组青蛙

也就是青蛙的上一半 那一队伍前面的那些

移到R上面去

所以对于前面的L Y S系统来讲

它相当于一片荷叶

那么得到的青蛙数量实际上是Jump(0,1)

同理 从S经过Y到R上面去也相当于是Jump(0,1)

所以这两个系统

各自完成了一半的青蛙转移

所以呢 我们就得到

Jump(1,1)是通过两个系统

一边走了两只青蛙 一边走了另外两只青蛙

所以就变成了两倍的Jump(0,1)

所以是2*2=4 Jump(0,1)是2

程序设计基础课程列表:

第一章 编程初步

-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 实现程序功能

-程设论道

--程设论道

-师生问答

--师生问答

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

5.5.3 问题分析——复杂情况笔记与讨论

也许你还感兴趣的课程:

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