在学习枚举算法之前,首先问有关枚举的几个问题

1. 为什么要进行枚举?

2. 需要对哪些对象进行枚举?

3. 如何进行枚举?

4. 枚举的结束条件是什么?

现在针对两个使用枚举算法的实例对以上问题进行分析.

实例一:熄灯问题

给定一个5×6的棋盘,上面有灯,每个灯都有各自的按钮,每个按钮按下去都会使其自己和周围的上下左右四盏灯改变(原来熄灭的变亮,原来亮的变灭),如何操作按钮使这个棋盘上所有灯都熄灭。

实例二:青蛙问题

一个5000×5000的稻田,有很多青蛙从这个稻田上跳过,每只青蛙跳过的步长不一样,青蛙每次总是沿着一条直线跳跃稻田(至少3个稻子),农民早上起来看到被踩踏的稻子,希望找到造成最大损害的那只青蛙经过的路径。

第一个问题:为神马要枚举?

因为解决这个问题可能不止一个方案,然而目前我并不知道哪个方案可以,仅仅知道如果按照这个方案操作造成的结果,这个结果是否符合最后的要求并不清楚。需要进一步实验验证。

实例一,总共有5×6个按钮可以操作,但并不知道按下哪些按钮会导致所有灯都熄灭。实例二,总共有5000×5000个稻子,被踩踏的稻子也很多,但是并不知道哪些稻子是被某只青蛙踩踏的,而且是最多的。

第二个问题:需要对哪些对象进行枚举?

接着上个问题所述,假定一个假设,接着进行这个假设,通过这个假设来进行推理,推理出一个结果,这个结果会接着推理下一个结果,顺序下去,最后可以推导出最终的结果,最终的结果是不是题目要求的结果。而这而的假设就是我们需要枚举的对象。这个假设要求可以推得最后的唯一结果,同时它必须不是很多,否则复杂度很大。

实例一,因为下一行的按钮负责将上一行的灯熄灭,一行一行的熄灭,只要第一行的按钮被按下去了,第一行的灯状态就可以确定,第二行的按钮只需要将第一行的熄灭就行,那么第二行的按钮状态也是确定的,依次类推,到最后第五行时,第五行的按钮负责熄灭了第四行的灯,但是不一定使第五行的灯熄灭。所以需要枚举的对象是第一行的按钮状态。

实例二,因为被踩踏的稻子数至少为3个,所以可以将这些被踩踏的任意两个稻子作为一只青蛙经过的路径。任意两个稻子就决定了这只青蛙的步长,根据步长就可以判断下这只青蛙的下一步的位置,依次可以推断出最后一个稻子的位置,就可以知道这只青蛙是不是踩踏最多的那只了。

第三个问题:如何进行枚举?

通过对第二个问题的分析,我们知道了需要对哪些对象进行枚举,接下来需要知道如何对这些对象进行枚举。具体如何枚举需要看所要枚举的对象。

实例一,需要枚举的对象是第一行的按钮状态,因为按下用1表示,不按用0表示,在枚举的过程中,实际是对第一行的6个按钮进行枚举,因为这六个按钮都是0和1,可以看作二进制数,枚举就是二进制不断加一的过程。

实例二,需要枚举的对象是踩踏稻子中任意两个稻子,实际是对n个数中任意两个数进行遍历,外层循环遍历 i 从1到n - 1, 内层循环遍历 j 从 i 到 n。

第四个问题:枚举的结束条件是什么?

通过问题二的分析知道,在某个假设,经过一步一步的推导,看最后的结果是否符合问题给出的条件或约束,如何符合,那枚举就可以结束,说明这个枚举就是最后的答案。

实例一, 第五行的按钮熄灭了第五行的灯,则符合将灯全部熄灭这一要求,所以枚举结束,获得正确的按钮。

实例二,最后一个稻子位置在被毁稻子列表中,而且这个枚举情况下的被毁稻子数最多,则枚举结束,可以判定这条路径就是被毁最多路径。

转载于:https://www.cnblogs.com/jinee/p/4596320.html

算法学习 -- 枚举相关推荐

  1. 算法学习——枚举之最简真分数

    算法描述 统计分母在指定区间[100,999]的最简真分数(分子小于分母,且分子分母无公因数)共有多少个,并求这些最简真分数的和 算法思路 对于指定区间,分母的枚举范围为 100~999 即是输入的a ...

  2. 好久没有看到这么有建设性德文章,由衷地赞叹《知其所以然地学习(以算法学习为例)》-By 刘未鹏(pongba)

    知其所以然地学习(以算法学习为例) By 刘未鹏(pongba) C++的罗浮宫(http://blog.csdn.net/pongba) Updated(2008-7-24):更新见正文部分,有标注 ...

  3. 算法学习:最小圆覆盖

    [参考博客] https://www.cnblogs.com/bztMinamoto/p/10698920.html [定义] [圆]一个圆心和他的半径,就能够确定这个半径 [解决问题] 字面意思 给 ...

  4. 算法学习:后缀数组(SA)

    [参考博客] https://xminh.github.io/2018/02/27/%E5%90%8E%E7%BC%80%E6%95%B0%E7%BB%84-%E6%9C%80%E8%AF%A6%E7 ...

  5. 算法学习:manacher

    [没有前置知识] [解决的问题] 大多数都和回文串有关 例如: 字符串中长度最长的回文串 [算法学习] manacher优秀的地方在于,他能够在线性时间内求出每个字符所对应的以其自身为中心的最长回文串 ...

  6. 两个字符串的最长公共子序列长度_算法学习笔记(58): 最长公共子序列

    (为什么都更了这么多篇笔记了,这时候才讲这么基础的内容呢?因为我本来以为LCS这种简单的DP不用讲的,结果CF不久前考了LCS的变式,然后我发现由于自己对LCS一点都不熟,居然写不出来 ,于是决定还是 ...

  7. 【基础】基础算法学习笔记(状态空间)

    基础算法学习笔记(状态空间) 一.状态空间 1.定义(什么是状态空间):一个实际问题的各种可能情况构成的集合.(解释:为什么需要算法来和程序来处理问题?如果一道题可以手算得到答案,换句话说就是存在通过 ...

  8. 算法学习之道,应有三重境界

    https://www.toutiao.com/a6712297555167805966/ 王国维先生在<人间词话>中写道:古今之成大事业.大学问者,必经过三种境界:"昨夜西风凋 ...

  9. 算法学习之模拟退火算法路径规划(python代码实现)

    模拟退火算法路径规划(python代码实现) 一.引言 二.算法介绍以及伪代码 1.算法通俗介绍 2.路径规划算法伪代码 三.算法流程及代码实现 1.地图创建 2.初始化路径 小结 3.计算适应度值 ...

最新文章

  1. (原)调用jpeglib对图像进行压缩
  2. 【MaxCompute】学习笔记基础说明
  3. 有意思,USB资料分享
  4. java字符串深克隆_Java中对象的深复制(深克隆)和浅复制(浅克隆)之序列化...
  5. Mybatis源码解析:sql参数处理(2)
  6. HDU 1754 I hate it【线段树之单点替换区间最值】
  7. Huffman编码树
  8. python实现仿射变换
  9. NOIP2016普及组初赛难点整理
  10. oracle建表及授权
  11. iphone手机屏幕开发尺寸
  12. 双光耦开关电源电路图_开关电源电路图及原理讲解
  13. 小程序动态隐藏分享按钮
  14. 2023年会议教学庭审录像机产品分析
  15. Java基础语法之变量、运算符、流程控制、数组和方法等基础语法
  16. 【持续更新中······】 各种模板+神奇黑科技
  17. php phpmailer 发送邮件
  18. 读jquery 权威指南[3]-动画
  19. #前端开发我们应该具备的硬核技能
  20. python unicode转换

热门文章

  1. windows 禁用ipv6服务_Win7电脑禁用ipv6协议的方法是什么?
  2. lol最强最高输出的adc_LOL:官方公布ADC的输出能力,最强最弱都是谁?德莱文不是最高的...
  3. 我的docker随笔36:定制jenkins镜像
  4. 我的docker随笔26:制作arm平台的python-pandas镜像
  5. python下面的代码_求下面python代码的差别。
  6. 【Flink】Flink 使用代码如何主动触发 SavePoint
  7. 【Flink】Flink netty 通讯 PartitionRequestClient NettyPartitionRequestClient
  8. 【elasticsearch】跨集群搜索
  9. 95-40-038-java.util.concurrent-ConcurrentLinkedQueue
  10. 【MySQL】MySQL 两种排序算法