题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3091

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 327680/327680 K (Java/Others)

Problem Description
One day , Partychen gets several beads , he wants to make these beads a necklace . But not every beads can link to each other, every bead should link to some particular bead(s). Now , Partychen wants to know how many kinds of necklace he can make.
 
Input
It consists of multi-case .
Every case start with
two integers N,M ( 1<=N<=18,M<=N*N )
The followed M lines contains
two integers a,b ( 1<=a,b<=N ) which means the ath bead and the bth bead
are able to be linked.
 
Output
An integer , which means the number of kinds that the
necklace could be.
 
Sample Input
3 3
1 2
1 3
2 3
 
Sample Output
2

题意:

给你N个珠子,这些珠子编号为1~N,然后给出可以连在一起的两个珠子的编号,求把他们全部串起来有多少种方案。

样例有两种项链穿法:

  ①:“1-2-3-1”(包含“2-3-1-2”,“3-1-2-3”这两种情况);

  ②:“1-3-2-1”(包含“3-2-1-3”,“2-1-3-2”这两种情况);

可以看出,珠子串出的项链呈环状,但是珠子有规定好的逆时针或者顺时针的顺序,不能翻面;

题解:

设 i 表示状态:i转化为二进制数后,第k位(从右往左数)为0,表示k号珠子还没穿上去;为1,就代表已经穿上去了;

设 j 代表当前状态下,最后一个穿上去的是j号珠子;

设dp[i][j]表示在(i,j)状态下的方案数;

AC代码:

 #include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
typedef long long ll;
int n,m;
bool link[][];
ll dp[<<][],ans;
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(link,,sizeof(link));
memset(dp,,sizeof(dp));
for(int i=,u,v;i<=m;i++)
{
scanf("%d%d",&u,&v);
link[v][u]=link[u][v]=;
} int ed_state=(<<n)-;
dp[][]=;
for(int state=;state<=ed_state;state++)
{
for(int i=;i<=n;i++)
{
if( (state&(<<(i-)))== || dp[state][i]== ) continue;
for(int j=;j<=n;j++)
{
if(!link[i][j]) continue;//这两颗珠子不能连在一起,跳过
if( state & (<<(j-)) ) continue;//这颗珠子已经在项链上,跳过
int next_state=state|(<<(j-));
dp[next_state][j]+=dp[state][i];
//printf("dp[%d][%d]=%I64d\n",next_state,next_bead,dp[next_state][next_bead]);
}
}
} ans=;
for(int i=;i<=n;i++) if(link[i][]) ans+=dp[ed_state][i];
printf("%I64d\n",ans);
}
}

HDU 3091 - Necklace - [状压DP]的更多相关文章

  1. HDU 4284Travel(状压DP)

    HDU 4284    Travel 有N个城市,M条边和H个这个人(PP)必须要去的城市,在每个城市里他都必须要“打工”,打工需要花费Di,可以挣到Ci,每条边有一个花费,现在求PP可不可以从起点1 ...

  2. HDU 4336 容斥原理 || 状压DP

    状压DP :F(S)=Sum*F(S)+p(x1)*F(S^(1<<x1))+p(x2)*F(S^(1<<x2))...+1; F(S)表示取状态为S的牌的期望次数,Sum表示 ...

  3. HDU 3001 Travelling ——状压DP

    [题目分析] 赤裸裸的状压DP. 每个点可以经过两次,问经过所有点的最短路径. 然后写了一发四进制(真是好写) 然后就MLE了. 懒得写hash了. 改成三进制,顺利A掉,时间垫底. [代码] #in ...

  4. HDU - 5117 Fluorescent(状压dp+思维)

    原题链接 题意 有N个灯和M个开关,每个开关控制着一些灯,如果按下某个开关,就会让对应的灯切换状态:问在每个开关按下与否的一共2^m情况下,每种状态下亮灯的个数的立方的和. 思路1.首先注意到N< ...

  5. hdu 4114(状压dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4114 思路:首先是floyd预处理出任意两点之间的最短距离.dp[state1][state2][u] ...

  6. HDU 3811 Permutation 状压dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3811 Permutation Time Limit: 6000/3000 MS (Java/Othe ...

  7. hdu 3091 Necklace 状态压缩dp *******

    Necklace Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 327680/327680 K (Java/Others)Total ...

  8. HDU 5838 (状压DP+容斥)

    Problem Mountain 题目大意 给定一张n*m的地图,由 . 和 X 组成.要求给每个点一个1~n*m的数字(每个点不同),使得编号为X的点小于其周围的点,编号为.的点至少大于一个其周围的 ...

  9. hdu 4628 Pieces 状压dp

    题目链接 枚举所有状态, 1表示这个字符还在原来的串中, 0表示已经取出来了. 代码中j = (j+1)|i的用处是枚举所有包含i状态的状态. #include <iostream> #i ...

随机推荐

  1. 解压安装的tomcat, 使用chkconfig命令让tomcat 随机启动,tomcat 变为系统服务

    使用解压安装的tomcat包,命令行输入 service tomcat start 会报 tomcat: unrecognized service 错误提示,意思是说系统没有找到该服务. 好了,我们现 ...

  2. GC--垃圾收集器

    把周末的文章放在现在才来写,是自己太忙了?还是堕落了? 好吧直接进入主题吧,简单干脆的理解会让自己记忆深刻: 首先说明:GC垃圾收集器关注两件事情: 第一件:查找所有存活对象. 第二件:抛弃死对象(不 ...

  3. PHP代码审计笔记--弱类型存在的安全问题

    0x01 前言 PHP 是一门弱类型语言,不必向 PHP 声明该变量的数据类型,PHP 会根据变量的值,自动把变量转换为正确的数据类型. 弱类型比较,是一个比较蛋疼的问题,如左侧为字符串,右侧为一个整 ...

  4. RF-For循环使用

    场景1:

  5. iOS开发-UIImageView的contentMode属性

    UIImageView 的contentMode这个属性是用来设置图片的显示方式,如居中.居右,是否缩放等,有以下几个常量可供设定:UIViewContentModeScaleToFillUIView ...

  6. date 类型转为varchar

    select t.type_id as typeId, t.type_name as typeName, t.type_order as typeOrder, t.type_link as typeL ...

  7. iOS 事件的产生、传递、响应

    一.事件的产生和传递 1.1.事件的产生 发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中为什么是队列而不是栈?因为队列的特定是先进先出,先产生的事件先处理才符合常 ...

  8. Python学习(23):Python面向对象(1)速成

    转自 http://www.cnblogs.com/BeginMan/p/3190776.html 一.Python经典类与新类 经典类:如果没有直接或间接的子类化一个对象,也就是说如果没有指定一个父 ...

  9. 【python3】urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)>

    在玩爬虫的时候,针对https ,需要单独处理.不然就会报错: 解决办法:引入 ssl 模块即可 核心代码 imort ssl ssl._create_default_https_context = ...

  10. 【Python3】 django2.0 url 跳转设置

    python: 3.6.4 django :  2.0 在创建应用时候.我是把 urls.py 分开了.所以在设置url跳转时候.要修改成如下模式 1  父 urls.py 里边要加上命名空间 2   ...