这题说的是给了n(14)个点,每个点都以他 为根的最大可容的孩子个数和最小的可溶孩子个数L[i] ,R[i]

问这n个点形成一棵树有多少种形态

我们让 dp[i][S] 表示 一 i为根节点 的 拥有孩子S(二进制数)状态的 方案数 , sub[S] , 表示 以 S 状态表示的 森林的 方案数, sum[S] 表示 一S 状态的 有根树 的 方案数

可以知道

dp[i][S] = sub[ S^(1<<i) ] { L[i]<=|S|<=R[i]   }

sum[S] = dp[i][S] { i=0,1,2,3,,,n-1 | S&1<<i!=0  }

sub[S] = sub[S] +  sum[H]*sub[S^H]{ H 为s 的 子集 ,然后 先固定 S 中第一个不是点 不是0 的一定要在 H 中, 这样是 为了保证 不会出现一个点被算了两次,可能这个点在枚举时存在对称性 , 我们一旦确定一个点在那个位置就可以避免这种情况的出现 }

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
using namespace std;
typedef long long ll;
const int mod = ;
int dp[][<<];
int sum[<<];
int sub[<<];
int L[],R[],n;
int cal(int S){
int num=;
for(int i=; i<n; ++i)
if(S&(<<i)) num++;
return num;
}
int main()
{
int cas;
scanf("%d",&cas);
for(int cc= ; cc<=cas; ++cc){
scanf("%d",&n);
for(int i=; i<n; ++i)
scanf("%d%d",&L[i],&R[i]);
for(int i=; i<n; ++i){
dp[i][]=;
}
sum[]=; sub[]=;
for(int S=; S<(<<n); ++S){
sum[S]=; sub[S]=;
int ge = cal(S);
for(int i =; i<n; ++i){
dp[i][S]=;
if( ( S&(<<i) )!= && L[i]<=ge&&R[i]>=ge ){
dp[i][S]= sub[S^(<<i)];
sum[S]= (dp[i][S]+sum[S])%mod;
}
}
int j=;
for( j=; j<n; ++j ) if(S&(<<j)) break; for(int H=S; H>; H=S&(H-)){
if((H&(<<j))==) continue;
ll a = sum[H];
ll b = sub[S^H];
sub[S]= ( sub[S] + a*b%mod )%mod;
}
}
int ans=;
for(int i=; i<n; ++i) ans=(ans+ dp[i][(<<n)-])%mod;
printf("%d\n",ans);
} return ;
}

hdu 5103 状态压缩dp的更多相关文章

  1. HDU 1074 (状态压缩DP)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:有N个作业(N<=15),每个作业需耗时,有一个截止期限.超期多少天就要扣多少 ...

  2. HDU 3341 状态压缩DP+AC自动机

    题目大意: 调整基因的顺序,希望使得最后得到的基因包含有最多的匹配串基因,使得所能达到的智商最高 这里很明显要用状态压缩当前AC自动机上点使用了基因的情况所能达到的最优状态 我最开始对于状态的保存是, ...

  3. hdu 4284 状态压缩dp

    题意: 有N 个点的无向图,要去其中 h个地点做事,做事需要先办理护照,之后可以挣一定数量的钱,知道了一开始有的总钱数,和 一些城市之间           道路的花费,问可不可以在 指定的 h 个城 ...

  4. hdu 2167 状态压缩dp

    /* 状态转移方程:dp[i][j]=Max(dp[i][j],dp[i-1][k]+sum[i][j]); */ #include<stdio.h> #include<string ...

  5. HDU 4856 (状态压缩DP+TSP)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4856 题目大意:有一个迷宫.迷宫里有些隧道,每个隧道有起点和终点,在隧道里不耗时.出隧道就耗时,你的 ...

  6. HDU 4640 状态压缩DP 未写完

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4640 解题思路: 首先用一个简单的2^n*n的dp可以求出一个人访问一个给定状态的最小花费,因为这i个 ...

  7. 2016"百度之星" - 初赛(Astar Round2A)1002 / HDU 5691 状态压缩DP

    Sitting in Line Problem Description   度度熊是他同时代中最伟大的数学家,一切数字都要听命于他.现在,又到了度度熊和他的数字仆人们玩排排坐游戏的时候了.游戏的规则十 ...

  8. HDU 5067 (状态压缩DP+TSP)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5067 题目大意:蓝翔挖掘机挖石子.把地图上所有石子都运回起点,问最少耗时. 解题思路: 首先得YY出 ...

  9. hdu 4539(状态压缩dp)

    题意:曼哈顿距离是指:|x1-x2|+|y1-y2|,只要知道这个概念题意就懂了. 分析:这道题与前面做的几道题有所不同,因为当前行不仅与前一行有关,而且与前两行有关,所以我们开数组的时候还要记录前两 ...

随机推荐

  1. web服务器http.server 【python】

    参考博客: http://lxneng.iteye.com/blog/492063 http://www.cnblogs.com/itech/archive/2011/12/31/2308697.ht ...

  2. Python 练习题:计算 MAC 地址

    #!/usr/bin/env python #-*- coding:utf-8 -*- ''' 给一个MAC地址加1 ''' mac = '52:54:00:e6:b2:0a' prefix_mac ...

  3. apache编译安装完成后的服务启动设置

    Apache安装后可通过其安装路径的bin目录下的apachectl脚本控制服务的启动和停止.本例中apache安装在/usr/local/apache-2.2.6,服务控制脚本为: /usr/loc ...

  4. MyEclipse 2016 CI修改web项目context-root

    右击项目properties——>搜索Deployment Assembly,修改如红框所示的Web Context Root

  5. poj_3352 连通图的桥

    题目大意 给定N个点,他们之间用一些双向边连通,使得这N个点两两相互可达.但是其中某些双向边为桥,这样若断开这些桥,则整个图就无法做到点之间两两可达.现在可以添加若干条双向边,使得断开图中的任意一条边 ...

  6. 解决提示“配色方案已更改为Windows7 Basic”

    WIN7是很多用户都用过的系统,是由微软推出的.下面就说一个小技巧. 如何解决Win7系统提示:“配色方案已更改为Windows 7 Basic”解决方案.   更改Win7配色方案 首先,右击桌面空 ...

  7. JS-缓冲运动-对联型悬浮框

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. vux版本升级

    一开始用的笨办法, 先卸载npm uninstall vux --save; 然后在安装npm install vux --save;  卸载的还是蛮快的,安装是在下班的时候,让电脑待机2个小时,第二 ...

  9. Jetty源码学习-编译Jetty源码二三事

    工作小几个月了,JDK基础和web应用框架学的的差不多了,开始学习Jetty源码,费了小半天才编译成功,把自己拆过的坑记录下来. 编译前的环境: MAVEN 3.3.Eclips eLuna Serv ...

  10. android 仿微信聊天界面,以及语音录制功能

    extends:http://104zz.iteye.com/blog/1709840 本例为模仿微信聊天界面UI设计,文字发送以及语言录制UI. 1先看效果图:     第一:chat.xml设计 ...