HDU 3200 Arborescence Counting
题目大意:
给一个点数不超过8的无权有向图, 求树形图的数目.
简要分析:
根据点数很少这个条件, 我们自然想到搜索或者状态压缩动态规划, 而这两种做法都是正确的, 在这里我重点介绍第二种算法.
先枚举根, 再用f[mask1][mask2]表示mask1集合里的点已连通且mask2集合里的点皆是此树形图的叶子, 这样定义状态是因为只用一维状态对于不同的转移得到相同的树形图这种情况不是很好处理, 而二维状态就可以这样转移: 由mask1中的点向外连边扩展出点v, 那么v必为新的叶子, 此时我们强制v的标号大于mask2中点的标号时再转移, 这样就能做到既不重复也不遗漏地计算. 空间复杂度O(2^2n), 时间复杂度O(2^2n*n^2).
代码实现:
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 7 const int MAX_N = 8, MAX_S = 1 << MAX_N; 8 int n, m, t, dp[MAX_S][MAX_S]; 9 char g[MAX_N][MAX_N + 1];10 11 int main() {12 while (scanf("%d", &n) != EOF) {13 if (!n) break;14 for (int i = 0; i < n; i ++) {15 scanf("%s", g[i]);16 for (int j = 0; j < n; j ++) g[i][j] -= '0';17 }18 19 int upper = 1 << n, ans = 0;20 for (int i = 0; i < n; i ++) {21 memset(dp, 0, sizeof(dp));22 dp[1 << i][1 << i] = 1;23 24 for (int mask = 0; mask < upper; mask ++)25 for (int s = mask; s; s = (s - 1) & mask)26 for (int u = 0; u < n; u ++) if (mask & (1 << u))27 for (int v = 0; v < n; v ++) if ((mask & (1 << v)) == 0 && g[u][v]) {28 int m1 = mask | (1 << v);29 int m2 = (s | (1 << v)) & (~(1 << u));30 if (((1 << (v + 1)) - 1) >= m2) dp[m1][m2] += dp[mask][s];31 }32 33 for (int s = 0; s < upper; s ++) ans += dp[upper - 1][s];34 }35 36 printf("%d\n", ans);37 }38 return 0;39 }
转载于:https://www.cnblogs.com/zcwwzdjn/archive/2012/02/25/2367351.html
HDU 3200 Arborescence Counting相关推荐
- 后缀数组 --- HDU 3518 Boring counting
Boring counting Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=3518 Mean: 给你一个字符串,求:至少出 ...
- 【HDU - 6184】Counting Stars(三元环计数,二分,优化暴力,O(m*sqrt(m)),图论)
题干: Little A is an astronomy lover, and he has found that the sky was so beautiful! So he is countin ...
- HDU 1718 Rank counting sort解法
本题是利用counting sort的思想去解题. 注意本题,好像利用直接排序,然后查找rank是会直接被判WA的.奇怪的推断系统. 由于分数值的范围是0到100,很小,而student 号码又很大, ...
- HDU 3664 Permutation Counting
Permutation Counting Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- HDU - 3518 Boring counting(后缀数组)
题目链接:点击查看 题目大意:给出一个字符串,问有多少个子串出现了两次以上,计算时彼此不能覆盖 题目分析:因为数据范围比较小,我们可以直接暴力,枚举子串的长度,利用height数组的性质将后缀分为不同 ...
- HDU 4358 Boring Counting ★★(2012 Multi-University Training Contest 6)
问题抽象:区间内恰好出现K次的数的个数. ------------------------------------------------------------------ UESTC出的题就是神啊 ...
- HDU 3664 Permutation Counting(DP)
题目链接 弱爆啦,组合弱爆了,反正是没想出来怎么搞这个题,其实这个公式不难推啊,反正就是没推出来.今天队内赛,实在是没办法了,暴力写了个DFS,先把10以内的打出表来,发现类似杨辉三角的一个表,推不出 ...
- HDU 5439 Aggregated Counting
题目大意: 由1开始不断往数组中添加数 就是按照当前所在位置所在的数表示的个数添加这个数目的数 1 2 2 3 3 后面因为要填4,而4号位置为3,说明之后要填3个4 问题就是给定一个n,找到n出现的 ...
- 苹果7手机html5测试,测试开发之前端——No7.HTML5中的鼠标事件
wordpress取文章时间 wordpress的时间处理, 取文章的本地时间用get_the_time('c'),其中c可以用"D, d M Y H:i:s"等替代. 取文章的U ...
- 解题报告 (十四) 数位DP
文章目录 数位DP 解题报告 HDU 4722 Good Numbers HDU 2089 不要62 HDU 3555 Bomb HDU 3652 B-number PKU 3252 Round Nu ...
最新文章
- linux查进程ps和top,Linux中几个进程查看命令总结 ps, top, htop, vmstat
- 基于matlab的离散系统时域分析实验,《信号与系统》 实验一 信号的时域分析及Matlab实现...
- mysql 时间日期类型 datetime、timestamp、date、time、year
- 我的WAF Bypass实战系列
- 1.QT中播放视频,录音程序的编写
- 国内Python最有钱途的方向,开发第二,它排第一!
- 使用C#操作XML文件
- LeetCode 116. 填充每个节点的下一个右侧节点指针
- ERROR: Couldn’t connect to Docker daemon at http+docker://localunixsocket - is it running?
- Verilog代码实例化的简单理解(以38译码器为例)
- 电脑怎么进入linux系统,Linux操作系统进入家用电脑成为发展新前景
- CLION CMAKE 缺-g 导致断点不执行(无效)
- js数组按中文拼音排序_这才是选择排序正确的打开方式!
- X Window 用户指南
- 移动网络安装测试软件,家宽众测中国移动手机版(在线宽带网速测试器)V2.0.3 去广告版...
- 【BZOJ4200】【NOI2015】小园丁与老司机(动态规划,网络流)
- 单反相机参数之光圈、快门篇
- NameSilo使用API进行动态域名解析DDNS
- 计算机管理guest用户在哪,电脑来宾账户权限设置怎么设置
- oracle gi和gc的区别,别装了,你肯定对GI有什么误解,这才是争取的区别不要弄错...