题目链接 Permutation 题目大意:给出n,和m个关系,每个关系为ai必须排在bi的前面,求符合要求的n的全排列的个数. 数据规模为n <= 40,m <= 20. 直接状压DP空间肯定是不够的. 考虑到m <= 20,说明每个连通块的大小不超过21. 那么我们分别对每个连通块求方案数,并且把不同的连通块的方案数组合起来即可. #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for…
题意: 一个有n个数的排列,给你一些位置上数字的大小关系.求合法的排列有多少种. 思路: 数字的大小关系可以看做是一条有向边,这样以每个位置当点,就可以把整个排列当做一张有向图.而且题目保证有解,所以只一张有向无环图.这样子,我们就可以把排列计数的问题转化为一个图的拓扑排序计数问题. 拓扑排序的做法可以参见ZJU1346 . 因为题目中点的数量比较多,所以无法直接用状压DP. 但是题目中的边数较少,所以不是联通的,而一个连通块的点不超过21个,而且不同连通块之间可以看做相互独立的.所以我们可以对…
题目大意 有 \(n\) 个整数 \(a_1,a_2,\ldots,a_n\),每个数的范围是 \([1,m]\).还有 \(k\) 个限制,每个限制 \(x_i,y_i\) 表示 \(a_{x_i}\leq a_{y_i}\). 问有多少种不同的情况,以及所有情况中 \({\sigma_0(\gcd(a_1,a_2,\ldots,a_n))}^3\) 的和. \(n\leq 20,m\leq {10}^{10}\) 题解 记 \(f(x)\) 为当 \(m=x\) 时第一问的答案. 记 \(g…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6149 题意:中文题目 解法:状压DP,dp[i][j]代表前i个低点,当前高点状态为j的方案数,然后枚举转移就好了,我的代码里为什么要用滚动优化,内存?内存是足够的,不需要优化,我的dp表示是前i个低点所以转移不是从i-1转移,是从前一个低点转移,所以滚动数组能完美解决这个问题. #include <bits/stdc++.h> using namespace std; typedef long…
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5434 Peace small elephant  Accepts: 38  Submissions: 108  Time Limit: 10000/5000 MS (Java/Others)  Memory Limit: 65536/65536 K (Java/Others) 问题描述 小明很喜欢国际象棋,尤其喜欢国际象棋里面的大象(只要无阻挡能够斜着走任意格),但是他觉得国际象棋里的大象太凶残了…
第一次写博客ORZ…… http://acm.split.hdu.edu.cn/showproblem.php?pid=1074 http://acm.hdu.edu.cn/showproblem.php?pid=1074 这两个总有一个是可以点开的…… 题意比较清晰的啦. 做法的话暴力显然不合适,15!太大. 所以考虑状压DP…… 代码参考了网上大神的.十分感谢.谢谢@键盘上的舞者 http://blog.csdn.net/libin56842/article/details/24316493…
HDU 4906 Our happy ending pid=4906" style="">题目链接 题意:给定n个数字,每一个数字能够是0-l,要选当中一些数字.然后使得和为k,问方案 思路:状压dp.滚动数组,状态表示第i个数字.能组成的数字状态为s的状态,然后每次一个数字,循环枚举它要选取1 - min(l,k)的多少,然后进行状态转移 代码: #include <cstdio> #include <cstring> typedef long…
题意:给你N(<=15)个作业,每个作业有最晚提交时间与需要做的时间,每次只能做一个作业,每个作业超出最晚提交时间一天扣一分 求出扣的最小分数,并输出做作业的顺序.如果有多个最小分数一样的话,则按照作业字典序输出(注意:输入也是按照字典序输入的) 题解:首先想到的是暴力dfs,但是会超时.接着我们看到n最大只有15,因此可以使用状压dp,但是状态不能用位置表示 但我们可以这样:0表示此作业没有做过,1表示已经用过了,接着遍历0->(1<<n)-1贪心(例如:3(011)可以找2(0…
题意:给一个n*m的格子,格子中有一些数,如果是正整数则为到此格子的花费,如果为-1表示此格子不可到,现在给k个宝藏的地点(k<=13),求一个人从边界外一点进入整个棋盘,然后拿走所有能拿走的宝藏的最小花费,如果一次不能拿走所有能拿到的或者根本拿不到任何宝藏,输出0. 解法:看到k的范围应该想到状态压缩,将每个格子都看成一个点,再新建两个点,一个表示边界外的起点,用0表示,一个表示边界外的终点,用n*m+1表示,然后相互建边,建有向边,边权为终点格子的花费值,(其实都不用建边,直接跑最短路也行)…
Doing Homework Problem Description Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Every teacher gives him a deadline of handing in the homework. If Ignatius hands in the homework after the deadline, the…
题意:给你一个基因序列s(只有A,T,C,G四个字符,假设长度为n),问长度为m的基因序列s1中与给定的基因序列LCS是0,1......n的有多少个? 思路:最直接的方法是暴力枚举长度为m的串,然后再用求LCS的dp.当然我们可以在枚举的时候同时进行dp,但是复杂的仍然为O(4 ^ m).我们可以观察求LCS 的状态转移方程:dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) 若s[i] == s1[j] dp[i][j] = max(dp[i - 1][j…
题意: 给出\(A(2 \leq A \leq 11), n(0 \leq n \leq 10^9), k(1 \leq k \leq 10^9)\). 求区间\([1, A^n]\)中各个数字互不相同的\(A\)进制数而且是\(k\)的倍数的个数. 分析: 如果\(n > A\),根据抽屉原理,\(n\)位\(A\)进制数一定会有重复的数字. 所以下面只讨论\(n \leq a\)的情况. 对于\(k\)的大小,分别使用不同的算法: \(k\)比较小的时候,用状压DP:\(d(S, x)\)表…
Travel PP loves travel. Her dream is to travel around country A which consists of N cities and M roads connecting them. PP has measured the money each road costs. But she still has one more problem: she doesn't have enough money. So she must work dur…
题目: 给你一个n*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大. Input 包括多个测试实例,每个测试实例包括一个整数n 和n*n个非负数(n<=20)Output对于每个测试实例,输出可能取得的最大的和 Sample Input 3 75 15 21 75 15 28 34 70 5 Sample Output 188 题解: 一看数据范围才20,再看一下题面基本上就是状态dp…
题意:一张图,F是起点,Y是必须要到的点,D不能走,G可以充电.可以往四个方向走,每走一步花费一个电,走到G可以选择充满电或者不充,每个G只能充一次.问你走遍Y的最小初始点亮.number(G) + number(Y) <= 15 思路:显然Y和G都只要用一次就行,那么状压YG状态.然后BFS出任意YG两点最短路,状压DP.用&判断最终结果是不是当前状态的子集. 代码: #include<set> #include<map> #include<cmath>…
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5691 题解: 和tsp用的状压差不多,就是固定了一些访问顺序. dp[i][j]表示前cnt个点中布满状态i且最后一个为j的状态的最大乘积和. 则有dp[i|(1<<k)][k]=max(dp[i|(1<<k)][k],dp[i][j]+a[j]*a[k]). #include<iostream> #include<cstring> #include<c…
题意:问你从 1 - n 至多选 m 个数使得他们的乘积不能整除完全平方数. 析:首先不能整除完全平方数,那么选的数肯定不能是完全平方数,然后选择的数也不能相同的质因子. 对于1-500有的质因子至多出现一次,有的可能出现多次,比如23,对于一个数最多出现一次,因为出现两次就超出500了. 而对于比较小的质因子,比如2,3,这样的,可以出现多次,这样的话我们就可以分开来计算. 对于出现多次的,一共只有8个,我们可以用状压,2, 3, 5, 7, 11, 13, 17, 19, 对于最多出现一次的…
题目链接 题意 给出n个灯,m个开关,每个开关控制一些灯,如果打开这个开关,这个开关控制的灯如果本来灭的就会亮,如果本来亮的就会灭.问在每个开关按下与否的一共2^m情况下,每种状态下亮灯的个数的立方的和. 思路 对于枚举2^m种情况是不实际的.题目要求的求立方和暗含玄机. 设每个灯的状态为X. ans = X^3 = (X1 + X2 + X3 + ... + Xn) * (X1 + X2 + X3 + ... + Xn) * (X1 + X2 + X3 + ... + Xn) = X1 * X…
题目大意:让你在1~n中选择不多于k个数(n,k<=500),保证它们的乘积不能被平方数整除.求选择的方案数 因为质数的平方在500以内的只有8个,所以我们考虑状压 先找出在n以内所有平方数小于等于n的质数,然后我们把它们作为状压的状态 然后要对每个小于n数进行状压,如果它不能被它能被质数的平方整除,那就筛出它所有的在状态内的质因子,大于状态内的质因子我们存到剩余因子的乘积的部分里 比如46,它的状态可以表示成0000 0001 (19,17,13,11,7,5,3,2)  46/2=23,把它…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4568 思路:首先spfa预处理出每对宝藏之间的最短距离以及宝藏到边界的最短距离,然后dp[state][u]表示当前在点u,状态为state的最短距离,然后更新就行. #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue&g…
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5564 题意: 求长度在[L,R]范围,并且能整除7的整数的总数. 题解: 考虑最原始的想法: dp[i][j][k]表示长度为i,并且对7取模得到j的以k结尾的数. 则有状态转移方程dp[i+1][(h*10)+l)%7][k]+=dp[i][h][k'](k+k'!=K). 但是i范围是1~10^9,需要矩阵加速. 这里对dp[i][j][k]的[j][k]两个状态进行压缩,得到转移矩阵mat[…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6006 题意: 在Google中,有个n项目,m个专家.第i个项目涉及c[i]个领域,分别为a[i][0]...a[i][c[i]-1].第i个专家精通d[i]个领域,分别为b[i][0]...b[i][d[i]-1]. 如果要完成一个项目,则这个项目所涉及到的每一个领域都必须至少有一个精通该领域的专家.你作为director,可以任意分配专家,但一个专家只能去做一个项目.问你最多能够完成多少个项目.…
Disney's FastPass Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4114 Description Disney's FastPass is a virtual queuing system created by the Walt Disney Company. First introduced in 1999 (thugh the idea of a…
题目链接:pid=3182">http://acm.hdu.edu.cn/showproblem.php?pid=3182 Problem Description In the mysterious forest, there is a group of Magi. Most of them like to eat human beings, so they are called "The Ogre Magi", but there is an special one…
HDU 4856 Tunnels 题目链接 题意:给定一些管道.然后管道之间走是不用时间的,陆地上有障碍.陆地上走一步花费时间1,求遍历全部管道须要的最短时间.每一个管道仅仅能走一次 思路:先BFS预处理出两两管道的距离.然后状态压缩DP求解,dp[s][i]表示状态s.停在管道i时候的最小花费 代码: #include <cstdio> #include <cstring> #include <queue> #include <algorithm> usi…
题目链接  Doing Homework        Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Every teacher gives him a deadline of handing in the homework. If Ignatius hands in the homework after the deadline, the teache…
题目大意:给你一个无向连通图(n<=30),点分为高点和低点,高点数量<=15,如果两个高点和低点都直接连边,那么我们称这三个点形成一个valley,每个点最多作为一个valley的组成部分,求valley的最大数量 高点状压,然后枚举低点,判断这个低点能否影响答案 注意:上一层的值要全都先赋给这一层,再枚举这一层,否则上一层的某些状态可能还没枚举到就枚举这一层了 (比如上一层可行的状态是0110,这一层新来了1001,我们要先把0110和1001赋给这一层,否则我们在从小到大先枚举0110时…
传送门 题目大意: 求[l, r]中数位的最长上升序列恰好为k的数的个数. 题目分析: 首先要理解\(o(nlogn)\)求LIS问题的思路,每次寻找第一个大于等于的数将其更改. 设dp[pos][sta][k]表示第pos位,sta见后,加入k是为了初始化减少后面的时间. sta表示前pos位的LIS,是一个2进制数,1~10位表示0~9是否被选,比如现在状态是0010100000,就是说LIS是2,4,分两种情况: 现在加入一个数字3,用LIS的方法找到第一个大于等于3的数----4,将其置…
题意:给你两个串,求用m个R,n个D能组成多少个包含这两个串 题解:先构造一个AC自动机记录每个状态包含两个串的状态, 状态很容易定义 dp[i][j][k][status]表示在AC自动机K这个节点 使用了 i 个D,j个R ,状态为status的方案数. 然后直接DP即可. #include <set> #include <map> #include <stack> #include <queue> #include <cmath> #inc…
题意:m个城市,n个人,让这n个人按固定顺序走遍m个城市.每个城市有一个单人票价pi.每个人在每个城市能获得vij的价值.如果多个人在同一城市,那么会额外获得价值,给出一张n * n价值表,额外价值为任意两个组成队伍的价值和.每个人可以在中途退出,但是退出后不能再回来.问终点后最大价值. 思路:dp[st][i]表示在i城市状态st的最大价值,然后打表打出st的所有子集,每次都往子集转移. 代码: #include<set> #include<map> #include<cm…