2021蓝桥杯省赛C++A组试题E 回路计数 状态压缩DP

题目描述

蓝桥学院由21栋教学楼组成,教学楼编号1到21。对于两栋教学楼a和b,当a和b互质时,a和b之间有一条走廊直接相连,两个方向皆可通行,否则没有直接连接的走廊。

小蓝现在在第一栋教学楼,他想要访问每栋教学楼正好一次,最终回到第一栋教学楼(即走一条哈密尔顿回路),请问他有多少种不同的访问方案?两个访问方案不同是指存在某个i,小蓝在两个访问方法中访问完教学楼i后访问了不同的教学楼。

提示:建议使用计算机编程解决问题。

解题思路

哈密尔顿回路是经典的NP难问题,暴力搜索效率太低,到后面时间非常长。采用状态压缩DP,可以在2秒左右完成遍历求解,时间可以接受。

dp数组解释:dp[i][j]表示当前正在i结点,走过的路径为j时的方案数。

状态转移方程:dp[j][S|(1<<j)]=dp[j][S|(1<<j)]+dp[i][S]

解释:从i结点转移到j结点,当前到达j结点,S为到达i结点时所走过的结点序列(二进制表示,如10101表示走过了1、 3、 5三结点,没有走过2、 4两个结点),则dp[j][S|(1<<j)]表示到达j结点时的访问方案数量。S|(1<<j)含义:S序列中第j个二进制位一定为0,因为还没有访问第j个结点,到达j节点之后,要将第j个二进制位置一。'|'和'<<'分别为按位或和左移操作。dp[i][S]为到达i结点时的不同访问方案数。即下一个结点的访问方案数为其所有前驱结点访问方案数的和。

注意:本题结果数字很大,dp数组和结果都要使用long long类型

答案

881012367360

代码实现

(关键代码已加注释)

#include<bits/stdc++.h>
using namespace std; typedef long long ll; const int n=21;
bool G[n][n];//边采用邻接矩阵存储
ll dp[n][1<<n]; void generateEdge(){//生成边
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(__gcd(i,j)==1){
G[i-1][j-1]=1;
G[j-1][i-1]=1;
}
}
}
} int main(){
memset(dp,0,sizeof dp);
memset(G,0,sizeof G);
dp[0][1]=1;//初始在0结点时,路径为000...1,方案数为1
generateEdge();
int m=1<<n;
for(int S=1;S<m;S++){//遍历访问序列
for(int i=0;i<n;i++) if(S&(1<<i))//遍历当前访问的结点,当前访问的结点其访问的序列中该二进制位必须为1
for(int j=0;j<n;j++){//遍历下一个访问结点
if(!(S&(1<<j))&&G[i][j])//如果j结点没有访问且i和j之间有边则状态转移
dp[j][S|1<<j]+=dp[i][S];
}
}
ll ans=0;
for(int i=0;i<n;i++){
ans+=dp[i][m-1];//最终的访问序列为全部访问过,即访问序列为21个1,可以从不同的结点开始访问,遍历求和
}
cout<<ans;
return 0;
}

2021蓝桥杯省赛C++A组试题E 回路计数 状态压缩DP详细版的更多相关文章

  1. 2021蓝桥杯省赛B组(C/C++)E.路径【最短路DP】

    2021蓝桥杯省赛B组题目(C/C++)E.路径 最短路径, 因为变化情况比较多, 所以开始想的是深搜, 但是太慢了, 跑不出来, 后来就想着优化一下, 有的地方到另一个地方可能会考虑很多遍, 于是考 ...

  2. 第八届蓝桥杯国赛java B组第三题

    标题:树形显示 对于分类结构可以用树形来形象地表示.比如:文件系统就是典型的例子. 树中的结点具有父子关系.我们在显示的时候,把子项向右缩进(用空格,不是tab),并添加必要的连接线,以使其层次关系更 ...

  3. 第四届蓝桥杯省赛 (JavaB组)

    第二题:马虎的算式 小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了. 有一次,老师出的题目是:36 x 495 = ? 他却给抄成了:396 x 45 = ? 但结果却很戏剧性,他的答案 ...

  4. 2016年蓝桥杯省赛C++A组 消除尾一

    消除尾一: 下面的代码把一个整数的二进制表示的最右边的连续的1全部变成0如果最后一位是0,则原数字保持不变. 如果采用代码中的测试数据,应该输出: 00000000000000000000000001 ...

  5. 蓝桥杯第十届C组试题C

    从0开始,从右到左给这些字符串的每一位字母起个名字. 比如:A(1位)A(0位) A(2位)A(1位)A(0位) AA = 27, 可以看成(26 * 1)+ A(1) 因为:字母每经过一个轮回,可就 ...

  6. 52-2018 蓝桥杯省赛 B 组模拟赛(一)java

    最近蒜头君喜欢上了U型数字,所谓U型数字,就是这个数字的每一位先严格单调递减,后严格单调递增.比如 212212 就是一个U型数字,但是 333333, 9898, 567567, 313133131 ...

  7. 带分数--第四届蓝桥杯省赛C++B/C组

    第四届蓝桥杯省赛C++B/C组----带分数 思路: 1.先枚举全排列 2.枚举位数 3.判断是否满足要求 这道题也就是n=a+b/c,求出符合要求的abc的方案数.进行优化时,可以对等式进行改写,改 ...

  8. 计蒜客蓝桥杯模拟赛 后缀字符串:STL_map+贪心

    问题描述 一天蒜头君得到 n 个字符串 si​,每个字符串的长度都不超过 10. 蒜头君在想,在这 n 个字符串中,以 si​ 为后缀的字符串有多少个呢? 输入格式 第一行输入一个整数 n. 接下来  ...

  9. 2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案

    2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案 不知不觉离决赛都过去一个月了,一直忙于各种事情,都忘记整理一份试题.当作回忆也好. 1. 标题:好好学习 汤姆跟爷爷来中国旅游.一天,他帮助 ...

随机推荐

  1. django开发前准备工作

    安装pip(python包管理器,类似npm) 安装virtualenv(python虚拟环境,可以形成一个版本隔绝的文件夹) virtualenv使用方法 1,virtualenv  project ...

  2. [转]Fabric2.3中使用test-network搭建测试网络

    这个测试网络一方面可以用来学习Fabric,另一方面也可以让一些更有经验的开发者来测试他们的智能合约和应用,但是不建议用于生产环境,在2.0版本后,这个测试网络也取代了原来的"first-n ...

  3. Django中间件、csrf跨站请求、csrf装饰器、基于django中间件学习编程思想

    django中间件 中间件介绍 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出. ...

  4. 【深度学习 论文篇 02-1 】YOLOv1论文精读

    原论文链接:https://gitee.com/shaoxuxu/DeepLearning_PaperNotes/blob/master/YOLOv1.pdf 笔记版论文链接:https://gite ...

  5. 2021.12.09 [HEOI2016/TJOI2016]排序(线段树+二分,把一个序列转换为01串)

    2021.12.09 [HEOI2016/TJOI2016]排序(线段树+二分,把一个序列转换为01串) https://www.luogu.com.cn/problem/P2824 题意: 在 20 ...

  6. 2021.10.29 P1649 [USACO07OCT]Obstacle Course S(BFS)

    2021.10.29 P1649 [USACO07OCT]Obstacle Course S(BFS) 题意: 给一张n*n的图,起点为A,终点为 B,求从A到B转弯次数最少为多少. 分析: 是否存在 ...

  7. 【职场必备】6个免费良心网站&职场办公网站(收藏血赚)

    1.随机自动生成头像的网站:https://www.tool22.com/Tools-SJTX.html2.迅捷PDF转换器:https://app.xunjiepdf.com/3.全网音乐下载:① ...

  8. Spring 源码(4)在Spring配置文件中自定义标签如何实现?

    Spring 配置文件自定义标签的前置条件 在上一篇文章https://www.cnblogs.com/redwinter/p/16165274.html Spring BeanFactory的创建过 ...

  9. XCTF练习题---MISC---hong

    XCTF练习题---MISC---hong flag:BCTF{cute&fat_cats_does_not_like_drinking} 解题步骤: 1.观察题目,下载附件 2.下载文件后发 ...

  10. keil工程当中实现printf重定向串口打印

    之前是完全不知道printf可以重定向设置 最近才发现还有这等好事,可以让printf直接实现串口打印 在网上找了很多资料,终于实现了我想要的效果 原理:printf是通过调用底部的fputc来实现打 ...