《入门经典》——6.24

有关递归与分治的几个问题:

  Q1:有一个2^k * 2^k的方格棋盘,恰有一个方格是黑色的,其他为白色的。你的任务是用包含3个方格的L型牌覆盖所有白色方格。黑色方格不能被覆盖,且任意一个白色方格不能同时被两个或更多牌覆盖。

  分析:这道问题我们在《algorithm puzzle》一书的专栏中曾经有过介绍,它是分治的典型题目。其实要说分治和递推,它们是有区别和共性的。它们的共性是都是建立不同状态之间的关系,然是不同点在于,递推从一个状态出发,往往建立起来与另一个状态的关系,但是分治不同,从一个状态出发将会建立起与多个状态的关系,然后分别求得这多个状态的参数。

  拿这道问题来说,用f[k]表示这道问题的解,我们将2^k * 2^k分成四块2^(k-1) * 2^(k-1)的正方形,分别记为A、B、C、D,其中一个正方形当中是有黑色方格的,我们避开它,在2^k * 2^k棋盘的正中间填充一个L型牌,这就很好的将问题进行分解了。

  即有f[k] = f[k-1]^4.

  而对于2^(k-1) * 2^(k-1)的方格棋盘,采取相同的策略,便形成了递归的模式。

  Q2:循环日程表问题

  有n=2^k个运动员进行网球循环赛,需要设计比赛日程表。每个选手必须与其他n-1个选手各赛一次;每个选手一天只能赛一次;循环赛一共进行n-1天。按此要求设计一张比赛日程表,它有n行和n-1列,第i行j列为第i个选手第j天遇到的选手。

  分析:看到题目的设定,仅仅是给出一个符合要求的循环日程表,这就是问题简化了很多。我们将这个表添加一个第0列,元素为1、2、3…n,这样得到一个n x n的表格,和上面的问题类似,我们将其分成4个小正方形,这就形成了分支策略。我们将n = 2^(k-1)的某种情况填充到左上、右下的正方形中,并基于左上的正方形中各元素值,进行+2^(k-1)处理,填充到右上的正方形中,同时将右上的正方形填充到左下的正方形中。现在我们想要得到n = 2^(k-1)的一种填充方式,我们继续进行如上的步骤,则形成了递归的过程。

  下面给出k=3的填充图来让读者更加明了这个过程。

 

原文地址:https://www.cnblogs.com/rhythmic/p/5615806.html