HDU 6321 (状压dp)
题目大意::
为给你n个点(n<=10,nn<=10,n)
初始时没有边相连
然后有m个操作(m<=30000m<=30000)
每次可以添加一条边或删除一条边
允许有重边
要求每次操作过后输出选这个图中不相交的k条边有多少种不同的方案
(k=1,2,3……n/2)
题目分析:
n最大只有10 , 所以很容易就可以想到状压DP , 但是我在打的时候并没有想出继承状态 , 后来看了题解才略有一丝感悟;
首先一个特别容易看出的状态是每加/减一条边后的状态是由前一个状态转移过来的 ;
而因为本状态是由上一个状态转移而来,因而我们可以考虑设立一个二维的dp数组,dp[now][s]。代表了在当前的状态now中集合数为s的匹配数。因此我们可以找到第一条状态转移的方程 dp[now][i]= dp[pre][i]. 我只能想到了这个Orz , 下面的状态转移 , 可以说是挺显然的 ,而我并没有看出。。
在每进行一次加边的过程中,我们可以发现,假设加的一条边在前一个状态没有出现过,那么加上这条边之后的状态是由前一个状态的匹配数的基础上转移而来的,因此有状态转移方程
同理,在每一次减边的过程中,如果减的两条边在前一个状态没有出现过的话,则在减去这条边后的状态是由前一个状态转移而来的,故有转移方程
将所有方案的匹配数求完之后,只需统计一下答案即可。
题解参考与chen大牛
#include <bits/stdc++.h>
#define maxn 2005
using namespace std;
const int mod=1e9+;
int dp[][maxn];///用滚动数组压缩
int cnt[maxn];
int ans[maxn];
char str[];
int bit(int x){//获取某个数二进制位上有多少个1
int cnt=;
while(x){
if(x&) cnt++;
x>>=;
}
return cnt;
}
void init(){//初始化处理二进制位上1的个数
for(int i=;i<;i++){
cnt[i]=bit(i);
}
}
int main()
{
int t;
scanf("%d",&t);
init(); while(t--){
int n,m;int now=,pre=;
scanf("%d%d",&n,&m);
int all=<<n;
memset(dp,,sizeof(dp));
dp[][]=;
while(m--){
scanf("%s",str);
int from,to;
scanf("%d%d",&from,&to);
from--,to--;
int tmp=(<<from)|(<<to);//代表第from位和第to位有一条边
for(int i=;i<all;i++){//先进行状态转移
dp[now][i]=dp[pre][i];
}
if(str[]=='+'){
for(int i=;i<all;i++){
if(!(tmp&i)){//如果没加上
dp[now][i|tmp]=(dp[now][i|tmp]+dp[pre][i])%mod;
}
}
}
else{
for(int i=;i<all;i++){
if(!(tmp&i)){//如果没减去
dp[now][i|tmp]=(dp[now][i|tmp]-dp[pre][i]+mod)%mod;
}
}
}
memset(ans,,sizeof(ans));
for(int i=;i<all;i++){//统计答案
ans[cnt[i]]=(ans[cnt[i]]+dp[now][i])%mod;
}
for(int i=;i<=n;i+=){///一个匹配数需要2个点
if(i!=) cout<<" ";
cout<<ans[i];
}
puts("");
// printf("%d %d\n",pre,now);
pre^=,now^=;
// printf("%d %d\n",pre,now);
}
}
}
HDU 6321 (状压dp)的更多相关文章
- HDU 4778 状压DP
一看就是状压,由于是类似博弈的游戏.游戏里的两人都是绝对聪明,那么先手的选择是能够确定最终局面的. 实际上是枚举最终局面情况,0代表是被Bob拿走的,1为Alice拿走的,当时Alice拿走且满足变换 ...
- HDU 3001 状压DP
有道状压题用了搜索被队友骂还能不能好好训练了,, hdu 3001 经典的状压dp 大概题意..有n个城市 m个道路 成了一个有向图.n<=10: 然后这个人想去旅行.有个超人开始可以把他扔到 ...
- hdu 2809(状压dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2809 思路:简单的状压dp,看代码会更明白. #include<iostream> #in ...
- hdu 2167(状压dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2167 思路:经典的状压dp题,前后,上下,对角8个位置不能取,状态压缩枚举即可所有情况,递推关系是为d ...
- Engineer Assignment HDU - 6006 状压dp
http://acm.split.hdu.edu.cn/showproblem.php?pid=6006 比赛的时候写了一个暴力,存暴力,过了,还46ms 那个暴力的思路是,预处理can[i][j]表 ...
- hdu 3254 (状压DP) Corn Fields
poj 3254 n乘m的矩阵,1表示这块区域可以放牛,0,表示不能,而且不能在相邻的(包括上下相邻)两个区域放牛,问有多少种放牛的方法,全部不放也是一种方法. 对于每块可以放牛的区域,有放或者不放两 ...
- HDU 5823 (状压dp)
Problem color II 题目大意 定义一个无向图的价值为给每个节点染色使得每条边连接的两个节点颜色不同的最少颜色数. 对于给定的一张由n个点组成的无向图,求该图的2^n-1张非空子图的价值. ...
- hdu 4739 状压DP
这里有状态压缩DP的好博文 题目:题目比较神,自己看题目吧 分析: 大概有两种思路: 1.dfs,判断正方形的话可以通过枚举对角线,大概每次减少4个三角形,加上一些小剪枝的话可以过. 2.状压DP,先 ...
- Travel(HDU 4284状压dp)
题意:给n个城市m条路的网图,pp在城市1有一定的钱,想游览这n个城市(包括1),到达一个城市要一定的花费,可以在城市工作赚钱,但前提有工作证(得到有一定的花费),没工作证不能在该城市工作,但可以走, ...
随机推荐
- python中Dict与OrderedDict
使用dict时,Key是无序的.在对dict做迭代时,我们无法确定Key的顺序. 如果要保持Key的顺序,可以用OrderedDict: from collections import Ordered ...
- 利用PHPExcel将数据导出到xls格式的excel文件
在开发某地的经营许可证管理系统的时候需要将数据导出打excel文件,虽然一年前做某集团的ERP的时候用到过一次导入和导出,但是那时候太忙没时间写博客,一年过去了我也忘的差不多了,所以趁着今天将此次的使 ...
- 728. Self Dividing Numbers可以自己除以自己的数字
[抄题]: A self-dividing number is a number that is divisible by every digit it contains. For example, ...
- Makefile 编写规则 - 1
Makefilen内容 1. 显示规则:显示规则说明了,如何生成一个或多个目标.这是由Makefile指出要生成的文件和文件依赖的文件.2. 隐晦规则:基于Makefile的自动推导功能3. 变量的定 ...
- location.replace() keeps the history under control
from https://dev.opera.com/articles/efficient-javascript Occasionally, it is necessary to change the ...
- 解决Tomcat错误信息:No 'Access-Control-Allow-Origin' header is present on the requested resource | Solving Tomcat Error: No 'Access-Control-Allow-Origin' header is present on the requested resource
最近在使用GeoServer调用Vector Tile服务时,经常会显示不出来结果.打开浏览器调试台,发现报No 'Access-Control-Allow-Origin' header is pre ...
- 图的遍历——BFS
原创 裸一篇图的BFS遍历,直接来图: 简单介绍一下BFS遍历的过程: 以上图为例子,从0开始遍历,访问0,按大小顺序访问与0相邻的所有顶点,即先访问1,再访问2: 至此顶点0已经没有作用了,因为其本 ...
- java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V
异常完整信息 严重: Servlet.service() for servlet RegServlet threw exception java.lang.NoSuchMethodError: org ...
- 学习使用MS SQL Server游标(CURSOR)
说实的,使用MS SQL Server这样久,游标一直没有使用过.以前实现相似的功能,都是使用WHILE循环加临时表来实现.刚才有参考网上示例练习写了一下.了解到游标概念与语法. 下面代码示例中,先是 ...
- 为什么 kubernetes 天然适合微服务 (2)
此文已由作者刘超授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验 三.微服务化的十个设计要点 微服务有哪些要点呢?第一张图是 SpringCloud 的整个生态. 第二张图是微服 ...