3.6. 基础组合算法与模拟算法

在计算机算法问题中有许多涉及排列组合的问题,有许多复杂问题要用到排列组合算法。解决排列和组合问题的算法统称为组合算法,是一类非常重要的基础算法。

还有一个算法问题的大类被称为模拟算法,就是用计算机软件来模拟现实世界的现象、问题和工作。广义来说,甚至可以认为一切计算机软件都是在对现实进行模拟,一切算法问题都是模拟问题。确实,在实际应用中计算机模拟类项目的范围及其广泛,比如虚拟现实技术、计算机仿真技术、人工智能和机器人技术、大家都喜欢的电子游戏,这些都大量依赖计算机仿真和模拟算法的应用。因此在算法竞赛中,模拟算法占据了最大的比例。模拟类问题往往没有特定的算法,甚至没有特定的方法和解题模式。解决模拟类问题依靠的是对大量基础算法的理解和掌握,依靠经验活学活用。

在这一部分,我们将学习几种常用的基础组合算法,首先我们要简单学习排列组合的数学知识,学习排列数、组合数的计算,学习Pascal三角形这个组合数学中的重要知识。然后学习怎样用算法生成排列和组合,学习几种简单实用的排列生成算法和组合生成算法。

随后我们将用几个实际题目来了解模拟算法问题的解决过程,包括下面几个问题:

  • 排座椅(洛谷P1056)

  • 玩具谜题(洛谷P1563)

  • 字符串的展开(洛谷P1098)

  • 生活大爆炸版石头剪刀布(洛谷P1328)

  • 迎春舞会之数字舞蹈(洛谷P1538)