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 ...
随机推荐
- vuejs时间格式化
date.js export function formatDate(date, fmt) { if (/(y+)/.test(fmt)) { fmt = fmt.replace(RegExp.$1, ...
- jQuery Colorbox弹窗插件使用教程小结、属性设置详解以及colorbox关闭
jQuery Colorbox是一款弹出层,内容播放插件,效果极佳,当然我主要是用来弹出图片啦. jQuery Colorbox不仅有弹性动画效果,淡入淡出效果,幻灯片播放,宽度自定义,还能够ajax ...
- git push 问题汇总
Q:git push时卡死 这个问题找的快要放弃的时候... A: git config --global http.postBuffer [via] Q:git push 报错 Counting o ...
- laravel 5.3升级5.4
1)修改 composer 配置文件 composer.json 1.如果你用了 laravel-admin,larvel-admin 版本改 1.4.x-dev 2.laravel 版本改 5.4. ...
- MSF 内网渗透笔记
进入meterpreter模式 在meterpreter中输入shell即可进入CMD窗口接着即可执行CMD命令,例如打开RDP服务REG ADD HKLM\SYSTEM\CurrentControl ...
- Unity Animation需要Inspector右键打开Debug模式,然后勾选Legacy,最后再Inspector右键打开Normal
- 脚本控制animation的事件
由于动作设计经常修改动作,所以每次改完都要再添加一次animation的事件,所以就直接写了个脚本,当然以后可以做成表格,然后用脚本从表格中读取,然后生成对应的animation事件.在Assets/ ...
- React Native(四)——顶部以及底部导航栏实现方式
效果图: 一步一步慢慢来: 其实刚入手做app的时候,就应该做出简单的顶部以及底部导航栏.无奈又在忙其他事情,导致这些现在才整理出来. 1.顶部导航栏:react-native-scrollable- ...
- 自定义 Core Data 迁移
本文转载至 http://objccn.io/issue-4-7/ 感谢本文作者 朱宏旭 的不啬分享 自定义 Core Data 迁移似乎是一个不太起眼的话题.苹果在这方面只提供了很少的文档,若是初次 ...
- x64枚举DPC定时器
@写在前面 不同于x86,x64的DPC是被加密了的.对于x64DPC的兴趣始于我已经流产的scalpel计划.当时问某牛怎么遍历,得到的答案是“500大洋给代码”.真是R了狗了,好歹小哥我 ...