使用动态规划实现错排问题-2023年全国青少年信息素养大赛Python复赛真题精选

[导读]:超平老师计划推出《全国青少年信息素养大赛Python编程真题解析》50讲,这是超平老师解读Python编程挑战赛真题系列的第15讲。
全国青少年信息素养大赛(原全国青少年电子信息智能创新大赛)是“世界机器人大会青少年机器人设计与信息素养大赛”赛事之一,由中国电子学会主办,包含很多赛项,大赛自2013年举办,已连续成功举办八届,已正式入围“2022-2025学年面向中小学生的全国性竞赛活动名单”。
大赛旨在激发广大青少年的科学兴趣和想象力,培养钻研探究、创新创造的科学精神和实践能力,促进青少年科技创新活动的广泛开展,发现和培养一批具有科研潜质和创新精神的青少年科技创新后备人才。
大赛主要竞赛类别包括电子科技、智能机器人、软件编程三类,全国青少年Python编程挑战赛就属于其中的软件编程类。
一.赛事说明
2023年(第9届)Python挑战赛赛程分为初赛、复赛和总决赛三个阶段。初赛是资格赛,复赛是地方选拔赛,总决赛是全国各地选拔的精英汇聚在一起进行PK。
本届Python挑战赛是在线上举行,参赛选手登录大赛官网在指定页面完成答题并提交答案。评定成绩的依据是同时考虑得分和用时两个方面,首先是得分高者名次靠前,如果得分一样,则用时少者名次靠前。
2023年全国青少年Python编程挑战赛华北赛区(北京)初中组复赛于2023年7月15日正式举行。一共有6道题,全是编程题,考试时间是90分钟。
今天超平老师分享的是第6题,也是最后一题,错排问题。
二.题目描述
题目背景:
圣诞节快到了,公司为每个员工都准备了礼物,每个礼物都有一个精美的盒子。如果所有的礼物都不小心装错了盒子,求所有礼物都装错盒子共有多少种不同情况。
输入描述:
输入一个正整数n表示公司人数,保证n ≤ 20。
输出描述:
输出一个整数,代表有多少种情况。
样例1:
输入:
2
输出:
1
三.思路分析
这是一个典型的错排问题,那什么是错排问题呢,我们来看两个大家都熟悉的生活场景。
10本不同的书放在书架,现重新摆放,使得每本书都不在原来的位置上,有几种摆法?

1个人给10个同学写信,但他把所有的信都装错了信封,问共有多少种错误的方式?

这些都是生活中的错排问题,推而广之,一个n个元素的排列,若一个排列中所有的元素都不在自己原来的位置上,那么这样的一个排列就称为原排列的一个错排。而研究一个排列的错排个数的问题,就称为错排问题。
错排问题,也叫做伯努利-欧拉错装信封问题,它是数学史上著名的数论问题。最早研究这个问题的是丹尼尔·伯努利。后来欧拉对此产生了兴趣,并独立解决了这个难题,并称其为“组合理论的一个妙题”。因此,历史上也将错排问题叫做“伯努利-欧拉装错信封问题”。
很明显,错位问题涉及到排列组合知识,首先能想到的自然是枚举算法,我们使用函数f(n)来表示n个数的错排总数。
当n = 1时,只有一个数字,不可能出现错排情况,所以f(1) = 0;
当n = 2时,全排列只有两种,分别是12和21,其中后者是错排,所以f(2) = 1;
当n = 3时,全排列有6种,分别是123、132、213、231、312、321,其中231和312是错排,所以f(3) = 2;
当n = 4时,全排列有24种,其中错排有9种,分别是2143、2341、 2413、3142、 3412、3421、 4123、4312、 4321,所以f(4) = 9;
......
枚举算法的编程实现是需要使用循环的,并且还是嵌套循环,嵌套的层数取决于n,n = 3时,使用3层循环,n = 4时,则为4层循环,以此类推。
随着n的增大,循环的次数越来越多,由于n是变化的, 直接使用枚举算法是无法编写代码的。
我们不妨换一个思路,对于n个元素的错排问题,可以将转化为 n - 1个元素的错排问题,它们只是规模大小不同,排列的算法其实是一样的。
因此,我们可以使用递推的思想来推导f(n)和f(n-1)之间的关系。
假定n - 1个元素是错排的,在增加第n个元素时,它是不能放在第n个位置(n的正确位置),那么它放在哪儿呢?
我们可以分两步来进行推导。
第一步,选择n的位置。
前面n - 1个元素任何一个位置都是可以的,假设放在第m位上(1 <= m <= n -1)。很显然,n的可选位置有n - 1种方案。
第二步,选择m的位置。
由于m被挤出来了, 需要考虑m的放置问题,m可以放哪些地方呢,此时又可以分两种情况:
-
放在n的位置,此时m和n的位置是固定的,错排就转化为除了m和n之外,其它n -2位的错排问题,即f(n - 2);
-
不放在n的位置,此时m的位置是固定的,错排就转化为除了m之外,其它n - 1位的错排问题,即f(n - 1);
因此,我们可以得出如下公式:

熟悉斐波那契数列的同学,应该对这个推导公式比较熟悉。
实际上,伟大的数学家欧拉早在200多年前就已经给出了这个递推公式,并解决了此题,然后将此题誉为“组合理论的一个妙题”。
有了递推公式,我们很容易就可以想到使用递归算法或者动态规划算法来编程实现。
接下来,我们进入具体的编程实现环节。
四.编程实现
根据上面的思路分析,我们使用两种方式来编写代码:
-
递归算法
-
动态规划
1.递归算法
根据前面的思路分析和递归算法的实现方式,需要先定义好递归函数,代码如下:

需要注意这里的两个if语句,这也是递归的出口,由于涉及到n - 1和n - 2,所以n = 1和n = 2时是不能直接使用推导公式的。
然后就可以调用递归函数计算出总的组合情况,代码如下:

递归的好处就是代码简洁,理解起来相对比较容易,缺点就是当递归层数较多时,执行时间太长,考试时有可能出现超时的情况。
2.动态规划
动态规划,英文Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。
对于动态规划,通常可以分成如下5个步骤:
-
确定dp数组以及下标的含义
-
确定递推公式
-
dp数组如何初始化
-
确定遍历顺序
-
举例推导dp数组
首先dp数组,在本题中,dp是一个一维列表,dp[i]表示i个盒子错排的方案数量。
递推公式在思路分析部分已经确定好了。
然后就是初始化了,我们只需要考虑dp[1]和dp[2]的情况即可。根据前面的分析,dp[1] = 0,dp[2] = 1。
我们先定义一个函数,用于计算错排数量,代码如下:

简单说明两点:
1). 为了方便计算,对于n个盒子,将列表长度设置为n + 1,其中dp[0]可以不用管,或者理解为n为0的情况;
2). 由于dp[1]和dp[2]是不能使用推导公式,所以循环需要在从n = 3开始,直到第n个元素结束,包括第n个元素。
接下来,获取用户输入,调用函数即可,代码如下:

如果我们将dp数组打印出来,可以看到如下结果:

这是n = 20的情况,测试程序,可以发现,随着n的增大,仍然可以在很短的时间内输出结果,这就是动态规划算法的强大之处了。
五.总结与思考
本题难度较大,考查的知识点主要包括:
-
处理输入数据;
-
函数的定义及使用;
-
列表的运算及操作;
-
递归算法;
-
动态规划算法;
作为初中组复赛压轴题,本题还是非常有难度的,这里的排列组合已经涉及到高中数学知识了。
虽然我们并不需要使用数学方法来解决,但要想完美的解决这个问题,需要理解并掌握动态规划算法。
给你留一个小小的思考题,除了上面提到的递归算法和动态规划算法,实际上还有两种算法可以解决,一是使用itertools中的permutations函数,二是使用迭代算法,赶紧动手尝试一下吧。
类似的错排问题还有不少,超平老师再给你来两题吧。
教室里有10个座位(1 ~ 10),10位同学分别坐在一个不同的位置上(1 ~ 10),现要求打乱所有同学的位置,打乱规则如下:所有的同学都不能出现在原来的位置上,问有多少种打乱的方法?
家中阳台有10盆不同的花,为保持新鲜感,希望每天重新摆放,使得每盆花都不在第一天放的位置。那么最多可以保持多少天每天摆法都不同?
你还有什么巧妙的解决方案吗,欢迎和超平老师交流。
如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香😄
更多教程,请移步至“超平的编程课”gzh。
相关文章:
使用动态规划实现错排问题-2023年全国青少年信息素养大赛Python复赛真题精选
[导读]:超平老师计划推出《全国青少年信息素养大赛Python编程真题解析》50讲,这是超平老师解读Python编程挑战赛真题系列的第15讲。 全国青少年信息素养大赛(原全国青少年电子信息智能创新大赛)是“世界机器人大会青少年机器人设…...
大规模向量检索库Faiss学习总结记录
因为最近要使用到faiss来做检索和查询,所以这里只好抽出点时间来学习下,本文主要是自己最近学习的记录,来源于网络资料查询总结,仅用作个人学习总结记录。 Faiss的全称是Facebook AI Similarity Search,是FaceBook的A…...
SpringCloudAlibaba之Sentinel(一)流控篇
前言: 为什么使用Sentinel,这是一个高可用组件,为了使我们的微服务高可用而生 我们的服务会因为什么被打垮? 一,流量激增 缓存未预热,线程池被占满 ,无法响应 二,被其他服务拖…...
哪种模式ip更适合你的爬虫项目?
作为一名爬虫程序员,对于数据的采集和抓取有着浓厚的兴趣。当谈到爬虫ip时,你可能会听说过两种常见的爬虫ip类型:Socks5爬虫ip和HTTP爬虫ip。但到底哪一种在你的爬虫项目中更适合呢?本文将帮助你进行比较和选择。 首先,…...
优维低代码实践:对接数据
优维低代码技术专栏,是一个全新的、技术为主的专栏,由优维技术委员会成员执笔,基于优维7年低代码技术研发及运维成果,主要介绍低代码相关的技术原理及架构逻辑,目的是给广大运维人提供一个技术交流与学习的平台。 优维…...
docker 离线模式-部署容器
有网络的情况下下载需要的镜像 比如(下面以tomcat为例子,其他镜像类似) docker pull tomcat打包镜像文件到本地 docker save tomcat -o tomcat.tar将tomcat.tar 上传到内网服务器(无外网环境) 导入镜像 docker load -i tomcat.tar创建容器…...
MDN-HTTP
参考资料 文章目录 HTTP简介HTTP 和 HTTPSHTTP消息典型的HTTP会话HTTP响应状态HTTP安全HTTP CookieHTTP压缩 HTTP简介 HTTP(Hypertext Transfer Protocol)是一种用于在计算机网络中传输超文本和其他资源的应用层协议。他是互联网的基础协议之一&#x…...
【数据库】PostgreSQL中使用`SELECT DISTINCT`和`SUBSTRING`函数实现去重查询
在PostgreSQL中,我们可以使用SELECT DISTINCT和SUBSTRING函数来实现对某个字段进行去重查询。本文将介绍如何使用这两个函数来实现对resource_version字段的去重查询。 1. SELECT DISTINCT语句 SELECT DISTINCT语句用于从表中选择不重复的记录。如果没有指定列名&…...
笔记本WIFI连接无网络【实测有效,不用重启电脑】
笔记本Wifi连接无网络实测有效解决方案 问题描述: 笔记本买来一段时间后,WIFI网络连接开机一段时间还正常连接,但是过一段时间显示网络连接不上,重启电脑太麻烦,选择编写重启网络脚本解决。三步解决问题。 解决方案&a…...
Java课题笔记~ Spring 概述
Spring 框架 一、Spring 概述 1、Spring 框架是什么 Spring 是于 2003 年兴起的一个轻量级的 Java 开发框架,它是为了解决企业应用开发的复杂性而创建的。Spring 的核心是控制反转(IoC)和面向切面编程(AOP)。 Spring…...
2022 robocom 世界机器人开发者大赛-本科组(国赛)
RC-u1 智能红绿灯 题目描述: RC-u1 智能红绿灯 为了最大化通行效率同时照顾老年人穿行马路,在某养老社区前,某科技公司设置了一个智能红绿灯。 这个红绿灯是这样设计的: 路的两旁设置了一个按钮,老年人希望通行马路时会…...
【雕爷学编程】Arduino动手做(195)---HT16k33 矩阵 8*8点阵屏模块6
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&#x…...
Typescript]基础篇之 tsc 命令解析
[Typescript]基础[TOC]([Typescript]基础篇之 tsc 命令解析 tsc 命令概览编译参数说明--declaration--watch 这里是对 tsc 的一个详细介绍 tsc 命令概览 安装 Typescript 后可以使用 tsc 编译 ts 文件,tsc 命令是否支持其它参数 如果需要查看 tsc 支持的命令,或者…...
测试人员简单使用Jenkins
一、测试人员使用jenkins干什么? 部署测试环境 二、相关配置说明 一般由开发人员进行具体配置 1.Repository URL:填写git地址 2.填写开发分支,测试人员可通过相应分支进行测试环境的构建部署 当多个版本并行时,开发人员可以通过…...
使用RecyclerView构建灵活的列表界面
使用RecyclerView构建灵活的列表界面 1. 引言 在现代移动应用中,列表界面是最常见的用户界面之一,它能够展示大量的数据,让用户可以浏览和操作。无论是社交媒体的动态流、商品展示、新闻列表还是任务清单,列表界面都扮演着不可或…...
linux ubuntu安装mysql
在 Ubuntu 上安装 MySQL 的步骤如下: 更新系统软件包列表: sudo apt update 安装 MySQL 服务器: sudo apt install mysql-server 安装完成,可以使用以下命令检查 MySQL 服务器是否正在运行: sudo systemctl status mysql 如果 MyS…...
计算机网络各层的功能以及常用协议
目录 1. 物理层(Physical Layer)2. 数据链路层(Data Link Layer)3. 网络层(Network Layer)4. 传输层(Transport Layer)5. 应用层(Application Layer) 计算机网…...
M. Minimal and Maximal XOR Sum 2023“钉耙编程”中国大学生算法设计超级联赛(7)hdu7359
Problem - 7359 题目大意:给出一个n个数的排列,可以将任意区间内的所有数头尾翻转,每次操作的费用等于区间长度,要求将其变成一个递增排列,求消耗费用的异或和的最小值和最大值 1<n<1e5 思路:操作…...
C++基础篇(五)内存模型及详细示例
目录 一、内存分区模型二、内存分区代码示例三、new 运算符详解 一、内存分区模型 C程序在运行时,将内存分为四个区域,不同的区域赋予不同的生命周期,以提供强大的灵活编程。 代码区:存储程序的二进制代码,通常是只读…...
基于 JMeter API 开发性能测试平台
目录 背景: 常用的 JMeter 类和功能的解释: JMeter 编写性能测试脚本的大致流程示意图: 源码实现方式: (1) 环境初始化 (2) 环境初始化 (3) 创建测试计划 (4) 创建 ThreadGroup (5) 创建循环控制器 (6) 创建 Sampler (…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
