博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【bzoj3033】太鼓达人 DFS欧拉图
阅读量:5319 次
发布时间:2019-06-14

本文共 822 字,大约阅读时间需要 2 分钟。

题目描述

给出一个整数K,求一个最大的M,使得存在一个每个位置都是0或1的圈,圈上所有连续K位构成的二进制数两两不同。输出最大的M以及这种情况下字典序最小的方案。

输入

一个整数K。

输出

一个整数M和一个二进制串,由一个空格分隔。表示可能的最大的M,以及字典序最小的排布方案,字符0表示关,1表示开。你输出的串的第一个字和最后一个字是相邻的。

样例输入

3

样例输出

8 00010111


题解

DFS欧拉图

简单学了一下深搜欧拉图,感觉复杂度好玄学啊。。

帖一发

把每个K-1位数看作点,添加1个字符看作边,那么就是求这个图的欧拉回路,直接爆搜即可。

时间复杂度$O(2^k)$

#include 
int n , m , vis[2050] , ans[2050];bool dfs(int x , int k){ if(vis[x]) return 0; if(k == m) return 1; ans[k] = x & 1 , vis[x] = 1; if(dfs((x << 1) & (m - 1) , k + 1)) return 1; if(dfs((x << 1 | 1) & (m - 1) , k + 1)) return 1; vis[x] = 0; return 0;}int main(){ int i; scanf("%d" , &n) , m = 1 << n; printf("%d " , m); dfs(0 , 1); for(i = 1 ; i < n ; i ++ ) printf("0"); for(i = 1 ; i <= m - n + 1 ; i ++ ) printf("%d" , ans[i]); printf("\n"); return 0;}

 

 

转载于:https://www.cnblogs.com/GXZlegend/p/7755304.html

你可能感兴趣的文章