用递归与分治策略求解网球循环赛日程表_算法设计:分治法(比赛日程安排)...

一、算法思路

1、思路

分治算法的思想是:对于一个规模位N的问题,若该问题可以容易解决(比如规模N较小),则直接解决,否则将其分解为M个规模较小的子问题,这些子问题互相独立,并且与原问题形式相同,递归的解决这些子问题,然后将各子问题的解合并得到原问题的解

2、分治法适用范围

一般具有以下特征的问题可以使用分治算法求解:

(1)求解问题可以分解为若干个规模较小的相同问题

(2)求解问题的规模分解到一定程度,就能够很容易地求解

(3)合并子问题的解可以得到问题的解

(4)由求解问题所分解的各个子问题是互相独立的

3、分治法的步骤

(1)分解:将要求解的问题划分为规模较小的同类问题

(2)求解:当子问题划分的足够小的时候,用比较简单的方法求解,得到子问题的解

(3)合并:按求解问题的要求,将子问题的解逐层合并,即可构成最终的解

二、分治法实例:比赛日程的安排

1、问题描述

某学校举行乒乓球比赛,在初赛阶段设置为循环赛,设有n位选手参赛,初赛共进行n-1天,每位选手要与其他每一位选手进行一场比赛,然后按积分排名选拔进入决赛的选手。根据学校作息时间,要求每位选手每天必须比赛一场,不能轮空。按此要求为比赛安排具体日程,即决定每天各选手对阵的对手

2、分析

设有n=2^k个选手参加循环赛,那么需要要求设计一个满足以下要求比赛日程表:

1)每个选手必须与其它n-1个选手各赛一次;

2)每个选手一天只能赛一次

3、图解

(1)2个选手的情况

f164f31480fff98497e50b4adfce3b2d.png

如果只有两个选手,那么第0列看作选手编号(我们从0开始对列编号,我们的第0列可以看作每个选手第0天在和自己打),第1列就是在第一天,每个选手要比赛的选手号

(2)如果选手的个数为2^2=4,那么日程安排如下图

582e3b8d49e94f2d498178e62e97c62a.png

如果有4个选手,分别设计4/2=2个选手的比赛日程表,1-2选手前一天的比赛日程表如上图表格左上角的深蓝色子表格部分,3-4选手前一天的比赛日程表如上图表格左下角的子表格。据此,后两天的日程表可以将左上角的子表按其对应位置抄到右下角的子表,左下角的子表可以按其对应位置抄到右上角的子表。(同时,我们注意到,这是表的行列均为参赛选手数2^2 = 4,在用分治法求行、列均为(2^2)/2的长度的子表时,首先确定左上角的子表,左下角的子表可以由左上角的子表加(2^2)/2得到)

(3)如果选手的个数为2^3=8,那么日程安排表如下:

72d0044303414252c41ac7e103592dce.png

选手人数为8时,左上角的子表是选手1至选手4的前三天的比赛日程,左下角是选手5至选手8前三天的比赛日程。据此后四天的比赛日程,就是分别将左上角子表按其对应位置抄到右下角,将左下角的子表按其对应位置抄到右上角。这样就完成了比赛日程的安排

这种解法是把求解2^k个选手的比赛日程问题划分为2^1,2^2,......,2^k个选手的比赛日程问题。也就是说,要求2^k个选手的比赛日程,就要分为两部分,分别求出2^(k-1)个选手的比赛日程,然后再进行合并。当然,这种解法只能求选手个数是2的次幂的情况

在每次迭代求解的过程中,可以看作4部分:

1)求左上角子表:左上角子表是前2^(k-1)个选手的比赛前半程的比赛日程。

2)求左下角子表:左下角子表是剩余的2^(k-1)个选手的比赛前半程比赛日程。这个子表和左上角子表的对应关系是,对应元素等于左上角子表对应元素加2^(k-1)。

3)求右上角子表:等于左下角子表的对应元素

4)求右下角子表:等于左上角子表的对应元素

代码实现如下:

#include

#include

int main(void)

{

int a[9][9];

int x,y,i,j,t;

for(x=0;x<9;x++){

for(y=0;y<9;y++){

a[x][y]=0;

}

}

int n=2;

a[1][1]=1;

a[1][2]=2;

a[2][1]=2;

a[2][2]=1;

for(t=1;t<3;t++){

/*使用分治法填充日程表*/

int temp=n;

n=n*2;

/*扩展左下角*/

for(i=temp+1;i<=n;i++)

for(j=1;j<=temp;j++)

a[i][j]=a[i-temp][j]+temp;

/*扩展右上角*/

for(i=1;i<=temp;i++)

for(j=temp+1;j<=n;j++)

a[i][j]=a[i][j-temp]+temp;

/*扩展右下角*/

for(i=temp+1;i<=n;i++){

for(j=temp+1;j<=n;j++)

a[i][j]=a[i-temp][j-temp];

}

}

//打印结果

for(i=0;i<9;i++){

for(j=0;j<9;j++){

printf("%d ",a[i][j]);

}

printf("");

}

return 0;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/567306.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

聚类算法 距离矩阵_谱聚类

比起传统的K-means算法&#xff0c;谱聚类对数据分布的适应性更强&#xff0c;计算量也要小很多。1. 谱聚类概述谱聚类是从图论中演化出来&#xff0c;主要思想是吧所有的数据看作空间中的点&#xff0c;这些点之间可以用边连接起来。距离较远的两个点之间的边权重值较低&#…

vlan划分不能上网_VLAN工作原理

什么是VLANVLAN(Virtual LAN)&#xff0c;翻译成中文是“虚拟局域网”。可以看做是在一个物理局域网络上搭建出几个逻辑上分离的几个局域网。举个例子来说&#xff0c;如果一个交换机划分为两个VLAN&#xff0c;则相当于这台交换机逻辑上划分为两个交换机。VLAN的一个简单直观说…

控制for each循环次数_CCF CSP编程题解201312-1:出现次数最多的数

试题编号&#xff1a;201312-1试题名称&#xff1a;出现次数最多的数时间限制&#xff1a;1.0s内存限制&#xff1a;256.0MB问题描述:给定n个正整数&#xff0c;找出它们中出现次数最多的数。如果这样的数有多个&#xff0c;请输出其中最小的一个。输入格式:输入的第一行只有一…

旋流式沉砂池计算_旋流沉砂池设计方法

旋流沉砂池设计接口条件和主要参数设计旋流沉砂池前要确认的接口条件和信息包括&#xff1a;地质、气候等基本设计条件&#xff1b;可用地尺寸及在总图的位置坐标&#xff1b;地坪标高&#xff0c;上下游水位或范围&#xff0c;冻土层高度&#xff0c;管道覆土小深度要求&#…

parallelstream启动的线程数_高并发与多线程网络学习笔记(三)线程组和线程池

线程组线程组的作用是&#xff1a;可以批量管理线程或线程组对象&#xff0c;有效地对线程或线程组对象进行组织。构造函数ThreadGroup(String name)//默认parent为当前线程组 ThreadGroup(ThreadGroup parent, String name)具体方法//评估当前活跃的线程数,包括当前group和子g…

pytorch l2正则化_吴恩达深度学习 编程作业六 正则化(2)

推荐守门员应该将球踢到哪个位置&#xff0c;才能让自己的队员用头击中。1.无正则化模型判别是否有正则化与调用其他计算函数。准确率&#xff1a;0.948/0.915明显过拟合overfiting了。2.L2正则化公式如下&#xff0c;在原有cost函数基础上增加L2项&#xff0c;L2为参数w的均方…

vs中工具箱代表的意思_“日”除了代表太阳,其实还有这种意思,特别是出现在这些词语中的“日”...

对于“日”来说&#xff0c;大家都并不陌生&#xff0c;对于日的成语更是多得数不胜数&#xff0c;今天小编将日字成语进行了一个总结&#xff0c;需要用到的朋友们可以收藏&#xff01;一&#xff1a;以“日”开头的成语&#xff0c;大多数形容的是时间。日积月累、日久天长、…

mysql or走索引吗_加了索引,mysql查询就一定会用吗?

小白白跑去鹅厂面试&#xff0c;面试官提出了一个很实际的问题&#xff1a; mysql增加索引&#xff0c;那些情况会失效呢&#xff1f;谈一下实际工作中遇到的情况。我们的小白白又抛出了白氏秘籍&#xff1a;用不用索引&#xff0c;找DBA小姐姐&#xff01;啊&#xff1f;这是你…

基本农田卫星地图查询_如何基于西安80坐标查询定位

1. 概述水经注软件除了可以轻松下载无水印Google Earth卫星影像、有明确拍摄日期的历史影像、地方高清天地图、百度高德大字体打印地图&#xff0c;且可按1万/5千等国家标准图幅下载&#xff0c;下载含高度的全国矢量建筑、全国乡镇及街区行政区划、地名点、高速铁路网、公交路…

tcp的无延时发送_高并发架构的TCP知识介绍

这是关于高并发架构网络协议基础知识的第二篇&#xff0c;编程路上的基础心法&#xff01;做为一个有追求的程序员&#xff0c;不能只满足增删改查&#xff0c;我们要对系统全方面无死角掌控。掌握了这些基本的网络知识后&#xff0c;相信一方面日常排错中会事半功倍&#xff0…

如何对一个变量数据进行正则判定_生存分析数据中的BuckleyJamesMultipleRegression Model...

一、模型简介目前&#xff0c;生存分析领域&#xff0c;最常用的是Cox比例风险回归模型&#xff0c;该模型具有良好的特性&#xff0c;不仅可以分析各种自变量对生存时间的影响&#xff0c;而且对基准风险分布不作任何要求(半参数模型)。Cox模型使用时要满足一定的条件&#xf…

格兰杰因果关系检验r语言_R语言系列第四期:R语言单样本双样本差异性检验

之前详细介绍了利用R语言进行统计描述&#xff0c;详情点击&#xff1a;R语言系列第三期&#xff1a;①R语言单组汇总及图形展示、R语言系列第三期&#xff1a;②R语言多组汇总及图形展示、R语言系列第三期&#xff1a;③R语言表格及其图形展示从这个部分我们就开始为大家介绍统…

java 配置jmstemplate_SpringBoot集成JmsTemplate(队列模式和主题模式)及xml和JavaConfig配置详解...

1.导入jar包&#xff1a;org.springframework.bootspring-boot-starter-activemqorg.apache.activemqactivemq-pool2.填写配置文件(application.properties)#设置JMS(AMQ)spring.activemq.broker-urltcp://localhost:61616spring.activemq.useradminspring.activemq.passwordad…

切面是异步还是同步操作‘_分布式中采用Logback的MDC机制与AOP切面结合串联日志...

导读&#xff1a;在实际开发中&#xff0c;打印日志是十分重要的。在生产环境中&#xff0c;如果日志打得好可以快速地排查问题&#xff0c;而在分布式的场景下&#xff0c;一个请求会跨越多个节点&#xff0c;既一个业务可能需要多个节点协调配合处理。那么日志将会分散&#…

java 图类_Java集合类,一张图说清楚!

作者&#xff1a;skywang12345https://www.cnblogs.com/skywa...2019-03-23 10:32:24Java集合是java提供的工具包&#xff0c;包含了常用的数据结构&#xff1a;集合、链表、队列、栈、数组、映射等。Java集合工具包位置是java.util.*&#xff0c;Java集合主要可以划分为4个部分…

python 取整_马克的Python学习笔记#数字,日期和时间

对数值进行调整在Python中对整数和浮点数进行数字计算是很容易的。但是&#xff0c;如果你需要对分数&#xff0c;数组或者日期和时间进行计算&#xff0c;这就会稍微复杂点。对于简单的取整操作&#xff0c;我们可以使用内建的round(value, ndigits)函数就可&#xff0c;举个例…

各路由协议的协议号_厂房转让协议

厂房转让协议转让方(甲方)&#xff1a;________________受让方(乙方)&#xff1a;________________甲乙双方本着平等互利的原则&#xff0c;经协商一致就甲方将其权属的工业用地、厂房等转让与乙方及有关事项达成如下协议:一、工业用地及厂房产权基本情况本协议转让的工业用地位…

java web开发常见问题_JavaWeb学习笔记(五)--Web开发其他常见问题

一、把web应用打成war包使用JDK自带jar命令&#xff0c;进入到web应用里面&#xff0c;执行命令&#xff1a;jar -cvf 包名.war . # .表示当前目录所有的文件 直接用jar可查看帮助执行完成后生成一个demo.war文件&#xff0c;把这个文件拷贝到Tomcat的webapps下&#xff0c;Tom…

uwsgi怎么通过浏览器访问某个脚本_4个Shell小技巧帮你提高机器学习效率:写好脚本,事半功倍...

晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI在机器学习的实践过程中&#xff0c;用好Shell能帮你很多节省时间。最近&#xff0c;有位来自ETHZ的学生分享了一些Shell小技巧。对程序员来说&#xff0c;这些技巧更重要的是让你的思维从琐碎小事中解脱出来&#xff0c;大大提高…

间接寻址级别不同_被遗忘的利息税,国债与存款的利率区别,同大额存单的4点大不同...

2020年6月10日的储蓄式电子国债发行又一次与理财人擦肩而过&#xff0c;因为疫情管控原因&#xff0c;此次暂时不发行&#xff0c;那么下一个认购国债的窗口&#xff0c;就是7月10日&#xff0c;仍然是储蓄式电子国债&#xff0c;期限还是3年期和5年期两种。那么能如期发行吗&a…