2021蓝桥杯省赛C++A组试题E 回路计数 状态压缩DP详细版
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详细版的更多相关文章
- 2021蓝桥杯省赛B组(C/C++)E.路径【最短路DP】
2021蓝桥杯省赛B组题目(C/C++)E.路径 最短路径, 因为变化情况比较多, 所以开始想的是深搜, 但是太慢了, 跑不出来, 后来就想着优化一下, 有的地方到另一个地方可能会考虑很多遍, 于是考 ...
- 第八届蓝桥杯国赛java B组第三题
标题:树形显示 对于分类结构可以用树形来形象地表示.比如:文件系统就是典型的例子. 树中的结点具有父子关系.我们在显示的时候,把子项向右缩进(用空格,不是tab),并添加必要的连接线,以使其层次关系更 ...
- 第四届蓝桥杯省赛 (JavaB组)
第二题:马虎的算式 小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了. 有一次,老师出的题目是:36 x 495 = ? 他却给抄成了:396 x 45 = ? 但结果却很戏剧性,他的答案 ...
- 2016年蓝桥杯省赛C++A组 消除尾一
消除尾一: 下面的代码把一个整数的二进制表示的最右边的连续的1全部变成0如果最后一位是0,则原数字保持不变. 如果采用代码中的测试数据,应该输出: 00000000000000000000000001 ...
- 蓝桥杯第十届C组试题C
从0开始,从右到左给这些字符串的每一位字母起个名字. 比如:A(1位)A(0位) A(2位)A(1位)A(0位) AA = 27, 可以看成(26 * 1)+ A(1) 因为:字母每经过一个轮回,可就 ...
- 52-2018 蓝桥杯省赛 B 组模拟赛(一)java
最近蒜头君喜欢上了U型数字,所谓U型数字,就是这个数字的每一位先严格单调递减,后严格单调递增.比如 212212 就是一个U型数字,但是 333333, 9898, 567567, 313133131 ...
- 带分数--第四届蓝桥杯省赛C++B/C组
第四届蓝桥杯省赛C++B/C组----带分数 思路: 1.先枚举全排列 2.枚举位数 3.判断是否满足要求 这道题也就是n=a+b/c,求出符合要求的abc的方案数.进行优化时,可以对等式进行改写,改 ...
- 计蒜客蓝桥杯模拟赛 后缀字符串:STL_map+贪心
问题描述 一天蒜头君得到 n 个字符串 si,每个字符串的长度都不超过 10. 蒜头君在想,在这 n 个字符串中,以 si 为后缀的字符串有多少个呢? 输入格式 第一行输入一个整数 n. 接下来 ...
- 2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案
2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案 不知不觉离决赛都过去一个月了,一直忙于各种事情,都忘记整理一份试题.当作回忆也好. 1. 标题:好好学习 汤姆跟爷爷来中国旅游.一天,他帮助 ...
随机推荐
- 微信小程序HTTP接口请求封装
1.方法封装(新建文件夹util,工具文件,在文件夹下创建request.js文件,用于对方法封装)request.js: var app = getApp(); //项目URL相同部分,减轻代码量, ...
- 跳转到下一页面时,必须先勾选阅读xx须知/协议才可跳转功能
当跳转到新的html页面时,先判断checkbox是否选中,选中-->跳转到新页面:未选中--弹出提示消息(请先同意须知) HTML: 1 <div class="choose& ...
- Thinkphp3.2.3 where注入 浅分析漏洞原理及修复
0x01引子 0x02分析 找到截断方法 找到_parseType的入口 找到生成sql语句的代码 0x03 poc链 0x04 利用示范 payload: http://localhost:3000 ...
- 如何利用MHA+ProxySQL实现读写分离和负载均衡
摘要:本文分享一下"MHA+中间件ProxySQL"如何来实现读写分离+负载均衡的相关知识. 本文分享自华为云社区<MySQL高可用架构MHA+ProxySQL实现读写分离和 ...
- swagger不再是第一选择了
一.前言 工欲善其事,必先利其器 最近对 API 接口协作的软件研究了好久,市面上的软件都下载用了一轮,下面给大家介绍其中的最强「神器」 Apifox. Apifox 官网:apifox.cn 在 ...
- 从实例学习 Go 语言、"基础与进阶" 学习笔记及心得体会、Go指南
第一轮学习 golang "基础与进阶"学习笔记,Go指南练习题目解析.使用学习资料 <Go-zh/tour tour>.记录我认为会比较容易忘记的知识点,进行补充,整 ...
- JetBrains Rider C# 学习②
前言 C#从入门到精通 链接:https://pan.baidu.com/s/1UveJI_f-c5Dul3GLIICRHg 提取码:1314 C#入门课程 刘铁猛 链接:https://pan.ba ...
- 踩了个DNS解析的坑,但我还是没想通
hello大家好,我是小楼. 最近踩了个DNS解析的小坑,虽然问题解决了,但排查过程比较曲折,最后还是有一点没有想通,整个过程分享给大家. 背景 最近负责的服务要置换机器.置换机器可能很多小伙伴不知道 ...
- HCIE笔记-第二节-数据封装+传输介质
数据传输的形式 1.电路交换 在通信之前,维护一条逻辑意义上的链路,这条链路仅仅可以传递两者的数据 2.报文交换 在数据之外,加上能够标识接收者.发送者的信息 3.分组交换(最主流) 依然进行报文交换 ...
- Maven中央仓库地址大全
1.默认的Maven中央仓库 在Maven安装目录下,找到:/lib/maven-model-builder-${version}.jar 打开该文件,能找到超级POM:\org\apache\ma ...