HDU 3091 - Necklace - [状压DP]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3091
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 327680/327680 K (Java/Others)
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.
necklace could be.
题意:
给你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]的更多相关文章
- HDU 4284Travel(状压DP)
HDU 4284 Travel 有N个城市,M条边和H个这个人(PP)必须要去的城市,在每个城市里他都必须要“打工”,打工需要花费Di,可以挣到Ci,每条边有一个花费,现在求PP可不可以从起点1 ...
- 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表示 ...
- HDU 3001 Travelling ——状压DP
[题目分析] 赤裸裸的状压DP. 每个点可以经过两次,问经过所有点的最短路径. 然后写了一发四进制(真是好写) 然后就MLE了. 懒得写hash了. 改成三进制,顺利A掉,时间垫底. [代码] #in ...
- HDU - 5117 Fluorescent(状压dp+思维)
原题链接 题意 有N个灯和M个开关,每个开关控制着一些灯,如果按下某个开关,就会让对应的灯切换状态:问在每个开关按下与否的一共2^m情况下,每种状态下亮灯的个数的立方的和. 思路1.首先注意到N< ...
- hdu 4114(状压dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4114 思路:首先是floyd预处理出任意两点之间的最短距离.dp[state1][state2][u] ...
- HDU 3811 Permutation 状压dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3811 Permutation Time Limit: 6000/3000 MS (Java/Othe ...
- hdu 3091 Necklace 状态压缩dp *******
Necklace Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 327680/327680 K (Java/Others)Total ...
- HDU 5838 (状压DP+容斥)
Problem Mountain 题目大意 给定一张n*m的地图,由 . 和 X 组成.要求给每个点一个1~n*m的数字(每个点不同),使得编号为X的点小于其周围的点,编号为.的点至少大于一个其周围的 ...
- hdu 4628 Pieces 状压dp
题目链接 枚举所有状态, 1表示这个字符还在原来的串中, 0表示已经取出来了. 代码中j = (j+1)|i的用处是枚举所有包含i状态的状态. #include <iostream> #i ...
随机推荐
- hibernate sqlite jdbctemplate 待研究
http://my.oschina.net/lldy/blog/39058 hibernate sqlite http://foru ...
- SaltStack Grains 和 Pillar
Grains: (1) grains 是服务器的一系列粒子信息,也就是服务器的一系列物理,软件环境信息(2) grains 是 minion 启动时收集到的一些系统信息,比如操作系统版本.内核版本.C ...
- Unity弹出MessageBox
[DllImport("User32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = Char ...
- 在input中既隐藏边框,也隐藏轮廓的设置
在设置input的时候,我们往往不想显示边框,所以通常会在css里面写"border"none",但是结果往往差强人意,如下图 我们这个时候可以加一个属性来把它的轮廓也隐 ...
- Mac下Intellij IDea发布JavaWeb项目 详解一 (1、新建JavaEE Project并进行相应设置 2、配置tomcat)
IDEA中 javaWeb项目的创建和tomcat配置(完整) 1.先新建JavaEE Project并进行相应设置 2.在配置tomcat Step1 新建JavaEE Project并进行相应设置 ...
- Bootstrap学习总结笔记(24)-- 基于BootstrapValidator的Form表单验证
Form表单进行数据验证是十分必要的,我们可以自己写JS脚本或者使用JQuery Validate 插件来实现.对于Bootstrap而言,利用BootstrapValidator来做Form表单验证 ...
- Qt编写activex控件在网页中运行
qt能够实现的东西非常多,还可以写activex控件直接在网页中运行.参照qtdemo下的例子即可. 方案一:可执行文件下载:https://pan.baidu.com/s/14ge9ix2Ny0x7 ...
- JS - 兼容到ie7的自定义样式的滚动条封装
demo: html: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...
- imsdroid 学习(初认识)
转:http://www.cnblogs.com/milospooner/archive/2012/07/15/2591979.html idoubs是imsdroid的IOS版本. 从google以 ...
- Minix中的字符判定ctype.c
minix中关于如何判定一个字符的类型,如大写.小写.数字…… 如果采用传统的方法,如判断一个字母大写的方法: if(c>='A' && c<'Z') return tru ...