《入门经典》——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的填充图来让读者更加明了这个过程。

时间: 2024-12-18 09:28:13

《入门经典》——6.24的相关文章

算法竞赛入门经典习题2-4 倒三角形

题目分析: 1.假设计数变量 i 从0开始: 2.第 i 行输出 i 个空格: 3.每行输出 (n-i)*2-1 个*: 4.注意换行 1 #include <stdio.h> 2 3 int main(int argc, const char * argv[]) { 4 int i,j,n,temp; 5 while(scanf("%d",&n)!=EOF) 6 { 7 for(i=0;i<n;i++) 8 { 9 for(j=0;j<i;j++) 1

《算法竞赛入门经典第二版》 P35 习题2-4 子序列的和(subsequence)

/* <算法竞赛入门经典第二版> P35 习题2-4: 输入两个正整数 n < m < 10^6,输出 (1/n)^2 + 1/(n+1)^2 +……+ 1/m^2,保留5位小数. 输入包含多组数据,结束标志为 m=n=0. 有错欢迎指出^_^ */ #include<stdio.h> int main() { int m,n,i,j=1; while(scanf("%d%d",&m,&n) != EOF) { double sum

《算法竞赛入门经典》动态规划复习

codevs 4979 数塔 1 #define N 100 2 #include<iostream> 3 using namespace std; 4 #include<cstdio> 5 int a[N][N],b[N][N],n; 6 int main() 7 { 8 scanf("%d",&n); 9 for(int i=1;i<=n;++i) 10 for(int j=1;j<=i;++j) 11 { 12 scanf("

c语言入门经典(第5版)

文章转载:http://mrcaoyc.blog.163.com/blog/static/23939201520159135915734 文件大小:126MB 文件格式:PDF    [点击下载] C语言入门经典(第5版)  内容简介: C语言是每一位程序员都应该掌握的基础语言.C语言是微软.NET编程中使用的C#语言的基础:C语言是iPhone.iPad和其他苹果设备编程中使用的Objective-C语言的基础:C语言是在很多环境中(包括GNU项目)被广泛使用的C++语言的基础.C语言也是Li

棋盘覆盖问题(算法竞赛入门经典)

在一个 2^k * 2^k 个方格组成的棋盘中,若恰有一个方格与其它方格不同,则称该方格为一特殊方格,称该棋盘为一特殊棋盘.显然特殊方格在棋盘上出现的位置有 4^k 种情形.因而对任何 k>=0 ,有 4^k 种不同的特殊棋盘.下图所示的特殊棋盘为 k=2 时 16 个特殊棋盘中的一个. 在棋盘覆盖问题中,要用下图中 4 中不同形态的 L 型骨牌覆盖一个给定的特殊棋牌上除特殊方格以外的所有方格,且任何 2 个 L 型骨牌不得重叠覆盖.易知,在任何一个 2^k * 2^k 的棋盘中,用到的 L 型

算法竞赛入门经典(二)

例2-4 文件读写(freopen重定向) #include<stdio.h> #define INF 1000000000 int file_freopen() { int x,min=INF,max=-INF,S=0,count=0; freopen("E:\\Code\\C\\算法竞赛入门经典\\Debug\\input.txt","r",stdin); freopen("E:\\Code\\C\\算法竞赛入门经典\\Debug\\out

拓扑排序(算法竞赛入门经典)

拓扑排序的定义: 把每个变量看成一个点,”小于“或者”先后“关系看成有向边,则我们得到一个有向图.这样我们的任务实际上是把一个图的所有节点排序,使每一条有向边的(u,v)对应的u都排在v之前,在图论中,我们称之为拓扑排序.不难发现,如果一个有向图里存在回路,则不存在拓扑排序(如果设置一个标志数组,我们可以发现回路中的点一直处于正在被访问状态,这可以作为拓扑排序的结束条件). 我们先看一个样例: 下面我们用邻接矩阵存储这张图:   0 1 2 3 0 0 1 1 1 1 0 0 1 1 2 0 0

jQuery Mobile入门经典 ([美] Phil Dutson) 中文pdf扫描版

jQury Mobile是以全球最流行的jQuery为核心的跨平台移动Web应用开发框架,自从诞生以来,就赢得了业内专家和技术社区的强烈关注.<jQuery Mobile入门经典>采用直观.循序渐进的方法讲解了如何借助jQuery Mobile,通过一个单一的代码库来创建适合各种移动设备的移动应用.<jQuery Mobile入门经典>分为4部分:第1部分介绍了jQuery Mobile的基础入门知识:第2部分讲解了用户界面相关的知识,读者将学到如何使用jQuery Mobile来

HTML、XHTML、CSS与JavaScript入门经典pdf

下载地址:网盘下载 内容介绍: 自从网站诞生以来,用于构建网站的语言就一直在不断地演化.现在一系列最佳实践已经出现,使用HTML或XHTML创建基本的网页,使用CSS控制它们的外观并使它们更加引人注目,使用JavaScript添加交互功能.<HTML.XHTML.CSS与JavaScript入门经典>一书假设您以前没有任何经验,这些宝贵的资源有助于如何使用最新的Web标准.不管您是期待编写第一个网页的初学者,还是急需提升编程技能的资深程序员,都会发现对这些基本语言的实践指导,以及有经验的Web

HTML与CSS入门经典(第7版) PDF下载高清完整原版

需要学习的朋友可以通过网盘免费下载pdf版 http://putpan.com/fs/7yi6be2ns3hucc8a1/ 内容简介  · · · · · · 梅洛尼.莫里森编著的<HTML与CSS入门经典(第8版)>是畅销图书 <HTML与CSS入门经典>的最新版,和过去的版本相同,本书仍然采用直观 .循序渐进的方法来为读者讲解使用HTML与CSS创建并发布网页的过程,以 方便读者掌握.<HTML与CSS入门经典(第8版)>总共分为24章和1个附录 ,其涵盖的内容有理