[Daimayuan] 最后的舞会(C++,DFS)

news/2024/4/20 22:30:05/文章来源:https://blog.csdn.net/m0_74036684/article/details/130348759

老师为即将毕业的同学们准备了一场舞会,有 2 N 2N 2N个同学会参加这场舞会,他们会被分成 N N N对跳舞,每个人有一个编号,如果编号为 i i i的同学和编号为 j j j的同学配对,那么这一对的满意度是 A i , j ( i < j ) A_{i,j}(i<j) Ai,j(i<j),我们规定这个舞会的满意度为每一队的满意度的异或和,也就是说,当同学们分成 N N N组后,第 i i i对同学的满意度为 A i A_i Ai,那么舞会的满意度为 A 1 ⊕ A 2 ⊕ . . . A N A1⊕A2⊕...AN A1A2...AN

请你求出本场舞会满意度的最大值

输入描述

第一行给出一个数 N N N,有 2 N 2N 2N个人参加舞会

接下来给出一个矩阵表示 i i i j j j配对时的满意度

A 1 , 2 , A 1 , 3 , . . . A 1 , 2 N A_{1,2},A_{1,3},...A_{1,2N} A1,2,A1,3,...A1,2N

A 2 , 3 , . . . A 2 , 2 N A_{2,3},...A_{2,2N} A2,3,...A2,2N

… … …

A 2 N − 1 , 2 N A_{2N−1,2N} A2N1,2N

其中 1 ≤ N ≤ 8 , 0 ≤ A i , j ≤ 2 30 1≤N≤8,0≤A_{i,j}≤2^{30} 1N8,0Ai,j230

输出描述

输出本场舞会满意度的最大值

样例输入

2
4 0 1
5 3
2

样例输出

6

样例解释

如果 { 1 , 2 } , { 3 , 4 } , a n s = A 1 , 2 ⊕ A 3 , 4 = 4 ⊕ 2 = 6 \{1,2\},\{3,4\},ans=A_{1,2}⊕A_{3,4}=4⊕2=6 {1,2},{3,4},ans=A1,2A3,4=42=6

如果 { 1 , 3 } , { 2 , 4 } , a n s = A 1 , 3 ⊕ A 2 , 4 = 0 ⊕ 3 = 3 \{1,3\},\{2,4\},ans=A_{1,3}⊕A_{2,4}=0⊕3=3 {1,3},{2,4},ans=A1,3A2,4=03=3

如果 { 1 , 4 } , { 2 , 3 } , a n s = A 1 , 4 ⊕ A 2 , 3 = 1 ⊕ 5 = 4 \{1,4\},\{2,3\},ans=A_{1,4}⊕A_{2,3}=1⊕5=4 {1,4},{2,3},ans=A1,4A2,3=15=4

最后答案为 m a x ( 6 , 3 , 4 ) = 6 max(6,3,4)=6 max(6,3,4)=6

解题思路

因为数据 N ≤ 8 N\le8 N8,所以直接 D F S + DFS+ DFS+剪枝就可以。

问题可能在于如何 D F S DFS DFS

写一个 D F S DFS DFS需要定义四个部分(并不一定都需要):状态部分(函数声明),停止条件,主体部分,返回后操作。

我们从简单到复杂逐个定义。

(1)结束条件:配对数到达 n n n

(2)返回后操作:将已配对的两个人取消标记;

(3)状态部分:状态部分为已配对数、舞会满意度;

(4)主体部分:首先利用一个循环找出第一个未配对的人,然后再用一个循环去为他搭配所有可能。

void dfs(int couple, int confid) {//状态if (couple == n + 1) {//结束条件ans = max(ans, confid);return;}//函数主体int i, j;for (i = 1; i <= 2 * n; i++) {if (!vis[i]) {for (j = i + 1; j <= 2 * n; j++) {if (!vis[j]) {vis[i] = vis[j] = true;dfs(couple + 1, confid ^ relation[i][j]);vis[i] = vis[j] = false;//返回后操作}}}}
}

如何降低时间复杂度:

(1)依靠遍历顺序: 1 , 2 1,2 1,2 2 , 1 2,1 2,1算一种情况,所以只考虑前者(递增序),依靠遍历查找的顺序来实现;

(2)依靠 D F S DFS DFS序:我们在第一层配对 1 1 1 3 3 3,在第二层配对 2 2 2 4 4 4这种情况与我们在第一层配对 2 2 2 4 4 4和在第二层配对 1 1 1 3 3 3二者是相同的。

优化之后的算法如下:

void dfs(int couple, int confid) {if (couple == n + 1) {ans = max(ans, confid);return;}int i, j;for (i = 1; i <= 2 * n; i++) {if (!vis[i]) break;//DFS序剪枝}for (j = i + 1; j <= 2 * n; j++) {//遍历顺序剪枝if (!vis[j]) {vis[i] = vis[j] = true;dfs(couple + 1, confid ^ relation[i][j]);vis[i] = vis[j] = false;}}
}

AC代码如下:

#include <iostream>
using namespace std;
const int max_n = 16;int relation[max_n + 1][max_n + 1], n, ans;
bool vis[max_n + 1];void dfs(int couple, int confid) {if (couple == n + 1) {ans = max(ans, confid);return;}int i, j;for (i = 1; i <= 2 * n; i++) {if (!vis[i]) break;}for (j = i + 1; j <= 2 * n; j++) {if (!vis[j]) {vis[i] = vis[j] = true;dfs(couple + 1, confid ^ relation[i][j]);vis[i] = vis[j] = false;}}
}int main() {cin >> n;for (int i = 1; i <= 2 * n; i++) {for (int j = i + 1; j <= 2 * n; j++) {cin >> relation[i][j];}}dfs(1, 0);cout << ans << endl;return 0;
}

(并没有什么奇妙的算法呢 q w q qwq qwq

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

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

相关文章

基于Html+Css的图片展示25

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

自动化工具 基于 Antd+DRF 开发了一款适配 JMeter 的接口自动化测试报告

JMeter Report 基于 AntdDRF 开发的一款 JMeter 测试报告服务&#xff0c;用于在 JMeter 接口测试中使用。 &#x1f334; 背景 JMeter 是测试工作中常用的一款工具&#xff0c;除了压测还可以用来做接口自动化的测试。 从事测试多年&#xff0c;接口自动化也做过很多的尝试…

基于PWM技术的三相光伏逆变器研究(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

一文让你熟练使用 JSONObject 和 JSONArray

依赖 导入阿里的 fastjson 依赖。 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.78</version></dependency>类型转换 String 与 JSON 相互转换 通过 JSONObject.parseObject…

面试2个月没有一个offer?阿里技术官的800页知识宝典打破你的僵局~

在经历了一波裁员浪潮后&#xff0c;大环境似乎有所好转&#xff0c;但对于面试者来说&#xff0c;面试愈发困难&#xff0c;现在面试官动不动就是底层原理&#xff0c;动不动就是源码分析&#xff0c;面试一定会抓你擅长的地方&#xff0c;一直问&#xff0c;问到你不会为止。…

集成学习(Ensembles)

Ensembles 前言EnsemblesAveraging,StackingWhy does averaging work?如何理解&#xff1a;In practice errors won’t be completely independent due to noise in the labels Random ForestsDoes averaging work if you use trees with the same parameters?Bootstrap Samp…

【手把手做ROS2机器人系统开发一】开发环境搭建

【手把手做ROS2机器人系统开发一】开发环境搭建 目录 【手把手做ROS2机器人系统开发一】开发环境搭建 一、专栏介绍&#xff1a; 二、开发环境搭建&#xff1a; 1.Ubuntu系统安装 2.ROS2系统环境安装 3.测试系统运行 一、专栏介绍&#xff1a; 大家好&#xff0c;今天给大家…

自然语言处理基本任务综述

文章目录 1.多语言分词2.词性标注3.命名实体识别4.中心词提取5.依存句法分析6.文本纠错7.文本摘要8.文本相似度9.情感分析10.文本分类11.词向量 1.多语言分词 ​ 在自然语言处理中&#xff0c;分词&#xff08;Tokenization&#xff09;是指将自然语言文本中的连续字符序列划分…

VRP开源的算例资源

VRP开源的算例资源 开源的算例资源 开源的MIP算例网址 1. MISOCP网址 Benchmark instances&#xff1a;多种问题的算例数据 TSP算例网址 VRP标杆算例网址 1. Networking and Emerging Optimization发布的VRP算例 2. PRP算例 3. 一个学者的主页上的算例 4. Chair in L…

MySQL-----复合查询

文章目录 前言一、基本查询回顾二、 多表查询解决多表查询的思路 三、自连接四、子查询1. 单行子查询2. 多行子查询3. 多列子查询4. 在from子句中使用子查询5. 合并查询5.1 union5.2 unoin all 总结 前言 前面的学习中,对于mysql表的查询都是对一张表进行查询,在实际开发中这远…

医药之家:19家医药企业获机构调研,8家公司接待超100家

据医药之家了解&#xff0c;4月17日至21日&#xff0c;两市约113家公司接受了机构调研&#xff0c;其中有19家为医药生物公司。从这19家医药生物公司的调研榜单来看&#xff0c;8家公司近5日接待机构家数超100家&#xff0c;分别是长春高新、国际医学、美好医疗、迪瑞医疗、祥生…

【中标通知】塔望咨询中标新疆农发集团 品牌规划建设项目

【新疆农发集团供应链有限公司-品牌建设项目】于2022年5月正式启动。 本次项目2022年4月6日招标结果正式公示。【塔望咨询】凭借3W消费战略方法体系和专注食品行业丰富的品牌项目经验&#xff0c;中标新疆农发集团供应链有限公司兵团红品牌规划建设项目。 中标结果公告 新疆农…

天梯赛 L3-025 那就别担心了

原题链接&#xff1a; PTA | 程序设计类实验辅助教学平台 题目描述&#xff1a; 下图转自“英式没品笑话百科”的新浪微博 —— 所以无论有没有遇到难题&#xff0c;其实都不用担心。 博主将这种逻辑推演称为“逻辑自洽”&#xff0c;即从某个命题出发的所有推理路径都会将结…

用java 实现二叉树创建

二叉树是数据结构中的一个重要的概念&#xff0c;二叉树的概念最早由 Linus Torvalds在1958年提出。他给出了一个树形数据结构&#xff0c;可以用来存储二叉树。每个节点的左子树和右子树都是空&#xff0c;中间层是子树。在一个给定的空间中&#xff0c;每一个节点都有两个左右…

相机雷达联合标定cam_lidar_calibration

文章目录 运行环境&#xff1a;1.1 ROS环境配置1&#xff09;工作空间创建和编译2&#xff09;官方数据集测试环境 2.1 在线标定1&#xff09;数据类型2&#xff09;标定板制作3&#xff09;配置文件4&#xff09;开始标定5&#xff09;完整实现步骤 3.1 python版本选择3.2 rvi…

4年的测试工程师,你遇到过自身瓶颈期吗?又是怎样度过的?

从毕业到现在已经快4年啦&#xff0c;一直软件测试行业混迹。我不是牛人&#xff0c;但是自我感觉还算是个合格的测试工程师&#xff0c;有必要写下自己将近4年来的经历&#xff0c;给自我以提示&#xff0c;给刚入行的朋友提供点参考。 貌似这一点适应的行业最广&#xff0c;…

Java——二叉搜索树的后序遍历序列

题目链接 牛客在线oj题——二叉搜索树的后序遍历序列 题目描述 输入一个整数数组&#xff0c;判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回 true ,否则返回 false 。假设输入的数组的任意两个数字都互不相同。 数据范围&#xff1a; 节点数量 0≤n≤1000 …

自习室管理系统的设计与实现(论文+源码)_kaic

摘要 近年来&#xff0c;随着高校规模的逐步扩大&#xff0c;学生对高校自习室座位的需求也在不断增加。然而&#xff0c;一些高校仍然采用人工管理学院自习室座位&#xff0c;这大大降低了管理效率。显然&#xff0c;开发一个成本低、占用资源少、能提高高校自习室座位管理效率…

Junit 5 如何使用 Guice DI

Guice 是一个依赖注入的小清新工具。 相比 Spring 的依赖管理来说&#xff0c;这个工具更加小巧&#xff0c;我们可以在测试中直接使用。 Junit 5 在 Junit 中使用就没有那么方便了&#xff0c;因为 Junit 没有 Guice 的注解。 你需要手动写一个类&#xff0c;在这个类中&a…

ABeam Insight | 智能制造系列(6):虚拟/增强现实(VR/AR)×智能制造

虚拟现实&#xff08;VR&#xff09;和增强现实&#xff08;AR&#xff09;的概念早在20世纪60年代就被提出&#xff0c;但由于当时的技术水平无法满足相关应用的需求&#xff0c;这些概念并没有引起广泛关注。直到近年来随着计算机技术的飞速发展&#xff0c;虚拟现实和增强现…