hdu 5713(状态压缩DP)
要进行两次dp,
第一个,dp[i],1<=i<=(1<<n)
其中用i的二进制形式表示已选择的点。
dp[i] 用来保存i中的点构成一个连通块,边集多少种可能。
转移方程:
save[0] = 1;//这里用save[i]表示dp[i]for(int i=1;i<(1<<n);i++){int ti = i-lowbit(i); //一定选择最后一个点,使之有序int j = ti;long long tmp=0;//问题转化为对立问题,记录有多少不连通边集的情况,all[i]表示i中的点,边集的所有可能情况。for(;j>0;j=(j-1)&ti){tmp += save[i-j]*all[j];tmp %= MOD;}save[i] = (all[i]-tmp+MOD)%MOD;}
第二次dp,套路基本相同。
dp[i][j] 表示恰有(i+1)个连通块,且含j中的点的所有可能。
转移方程:
for(int i=1;i<kk;i++){for(int j=1;j<(1<<n);j++){int tj= j-lowbit(j);for(int k=tj; k>0;k = (k-1)&tj ){dp[i][j] += dp[i-1][k]*save[j-k];dp[i][j] %= MOD;}}}
// // main.cpp // Astar160529 // // Created by 陈加寿 on 16/5/29. // Copyright © 2016年 chenhuan001. All rights reserved. // #include <iostream> #include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> using namespace std;#define MOD 1000000009long long dp[15][1<<14]; int mat[15][15]; long long save[1<<14]; long long s2[500]; long long all[1<<14];int lowbit(int x) {return x&(-x); }void test() {int cnt=0;for(int i=0;i<(1<<14);i++){for(int j=i;j>0;j=(j-1)&i){cnt++;}}cout<<cnt<<endl;cout<<(1<<28)<<endl; }int main() {s2[0] = 1;for(int i=1;i <= 14*14;i++)s2[i] = (2*s2[i-1])%MOD;//test();int T;cin>>T;int tt=1;while(T--){int kk,n,m;scanf("%d%d%d",&n,&m,&kk);int cnt0=0;memset(mat,0,sizeof(mat));for(int i=0;i<m;i++){int a,b;scanf("%d%d",&a,&b);a--; b--;if(a==b) cnt0++;else{mat[a][b] = mat[b][a] = 1;}}memset(save,0,sizeof(save));memset(all,0,sizeof(all));memset(dp,0,sizeof(dp));for(int i=0;i<(1<<n);i++){int tcnt=0;for(int j=0;j<n;j++){if( ((1<<j)&i) !=0){for(int k=j+1;k<n;k++){if( ((1<<k)&i) !=0 ){tcnt += mat[j][k];}}}}all[i] = s2[tcnt];}save[0] = 1;for(int i=1;i<(1<<n);i++){int ti = i-lowbit(i);int j = ti;long long tmp=0;for(;j>0;j=(j-1)&ti){tmp += save[i-j]*all[j];tmp %= MOD;}save[i] = (all[i]-tmp+MOD)%MOD;dp[0][i] = save[i];}for(int i=1;i<kk;i++){for(int j=1;j<(1<<n);j++){int tj= j-lowbit(j);for(int k=tj; k>0;k = (k-1)&tj ){dp[i][j] += dp[i-1][k]*save[j-k];dp[i][j] %= MOD;}}}printf("Case #%d:\n",tt++);cout<<dp[kk-1][(1<<n)-1]*s2[cnt0]%MOD<<endl;}return 0; }
CODE
hdu 5713(状态压缩DP)相关推荐
- hdu 5067(状态压缩dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5067 解题思路:这道题开始想复杂了,想用bfs去求出最短距离,其实没必要,因为题目中没有阻碍关系,所以 ...
- hdu 5418(状态压缩dp+Floyd)
点击打开链接 解题思路:这道题目和TSP问题很相似,唯一不同的是同一个点可以重复走几次.... 这道题目只有16个顶点,所以很容易想到状态压缩dp,dp[i][j]表示到达顶点i时的状态为j的最小花费 ...
- Victor and World(spfa+状态压缩dp)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5418 Victor and World Time Limit: 4000/2000 MS (Java/ ...
- Light OJ 1316 A Wedding Party 最短路+状态压缩DP
题目来源:Light OJ 1316 1316 - A Wedding Party 题意:和HDU 4284 差点儿相同 有一些商店 从起点到终点在走过尽量多商店的情况下求最短路 思路:首先预处理每两 ...
- 状态压缩dp学习小记part2
继续学习状态压缩的相关知识. 本来准备继续按照上篇博文里提到的那篇论文继续学习,但被矩形完全覆盖虐了回来,决定先做些其他的题增进理解之后再回来做. Zoj 3471 Most Powerful 题目链 ...
- 0x56. 动态规划 - 状态压缩DP(习题详解 × 7)
目录 Problem A. 最短Hamilton路径 ProblemB. 蒙德里安的梦想 Problem C. Corn Fields Problem D. 小国王 Problem E. 炮兵阵地 P ...
- POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)
poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...
- BZOJ1688|二进制枚举子集| 状态压缩DP
Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) ...
- hdu1074 状态压缩dp+记录方案
题意: 给你一些作业,每个作业有自己的结束时间和花费时间,如果超过结束时间完成,一天扣一分,问你把n个作业完成最少的扣分,要求输出方案. 思路: 状态压缩dp,记录方案数的地方 ...
最新文章
- 软件测试 -- 元素定位
- Codeforces 484B Maximum Value(高效+二分)
- eclipse中YAML文件编辑插件:Yaml Editor插件安装
- LiveVideoStackCon 2021北京站 9月再次启航!
- Java中线程池,你真的会用吗?
- Python3之socket编程(TCP/UDP,粘包问题,数据传输、文件上传)
- PHP-----文件系统的交互
- pythonATM,购物车项目实战_补充5-interface接口
- Setinterl全面介绍
- 一个500强公司的数据化运营管理实践 1
- 一元二次方程共轭复根c语言,共轭复根怎么求(共轭虚根α和β怎么求)
- 直播平台搭建源码,css预加载旋转动画 与 流光字体
- 一台“真正的”网吧电影服务器只要6000元
- WebView加载String字符串
- (CVPR-2022)AdaViT:用于高效图像识别的自适应视觉变换器
- 一、区块链项目的基础架构
- visual studio 2010教程-创建网站项目
- 美国纽约大学计算机排名,纽约大学计算机科学与信息系统世界排名2019年最新排名第20(QS世界排名)...
- 初一年级上学期计算机课知识总结,在电脑上学习七年级上册课程
- linux下烧写atmel芯片