bzoj1399 WIN
来源:互联网 发布:apm2.8源码编译 编辑:程序博客网 时间:2024/06/05 22:42
一道dp题
一棵赛程树是一棵以m为根的特殊的二叉树
/**
意思是每一个非叶子节点都有2个儿子
**/
dp[i][s][h]
三位状态中
i表示这棵子树的根为i
s表示这棵子树中含有的节点状态
h表示这棵子树的高度
dp[i][s][h]=∑dp[j][s’][h-1]*dp[i][s-s’][h-1]
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;int n,m;int head[16];int next[405];int to[405];int cnt;int calc[1<<16];int dp[16][1<<16][8];inline void dfs(int id,int s,int h){ if(dp[id][s][h]!=-1) { return ; } if((1<<h)<calc[s]) { dp[id][s][h]=0; return ; } if(s==(1<<id)) { dp[id][s][h]=1; return ; } if(h==0) { dp[id][s][h]=0; return ; } dp[id][s][h]=0; int i,j; for(i=s&(s-1);i;i=(i-1)&s) { if((1<<id)&i) { continue; } for(j=head[id];j!=-1;j=next[j]) { if(!((1<<to[j])&s)) { continue; } if(!((1<<to[j])&i)) { continue; } dfs(id,s-i,h-1); dfs(to[j],i,h-1); dp[id][s][h]+=dp[id][s-i][h-1]*dp[to[j]][i][h-1]; } }}int main(){ int i,j,id,num; while(scanf("%d %d",&n,&m)!=EOF) { memset(head,-1,sizeof(head)); cnt=0; memset(dp,-1,sizeof(dp)); memset(calc,0,sizeof(calc)); id=0;num=1; while(num<n) { num*=2; id++; } m--; for(i=0;i<(1<<n);i++) { for(j=0;j<n;j++) { if((1<<j)&i) { calc[i]++; } } } for(i=0;i<n;i++) { for(j=0;j<n;j++) { scanf("%d",&num); if(num==1) { next[cnt]=head[i]; to[cnt]=j; head[i]=cnt; cnt++; } } } dfs(m,(1<<n)-1,id); cout<<dp[m][(1<<n)-1][id]<<endl; } return 0;}
2 0
- bzoj1399 WIN
- bzoj1399 Win
- bzoj1399: Win
- win
- win
- WIN
- win site
- WIN屏蔽
- Win-Top
- Win闹钟
- Win-TC
- Win调用
- win 命令
- win command
- Win批处理
- WIN键
- Win 7
- Win FX
- nginx的root 指令
- UIActionSheet的使用
- 天猫总架构师何崚:好的技术团队不是“需求翻译机”或“架构优化机”
- Java获取计算机的IP、名称、操作系统等信息
- C++根据加密头信息,判断文件是否为加密文件
- bzoj1399 WIN
- VMware Ubuntu安装详细过程(下)
- autowire异常
- 自定义控件
- UIImageView的使用
- 学习笔记_常用第三方模块-PIL
- web开发 学什么?
- svn、git的坑要小心
- 用Spring Boot & Cloud,Angular2快速搭建微服务web应用 - 增加权限控制