bzoj1399 Win
来源:互联网 发布:网络免费赚钱项目 编辑:程序博客网 时间:2024/05/20 03:45
状压dp,
注意记录状态的时候需要记录高度,因为只要求保证总高度最小,并不要求局部最小。
#include<cstdio>#include<algorithm>using namespace std;int map[20][20],dp[16][66000][6],vis[16][66000][6],dep[]={0,1,2,3,3,4,4,4,4,5,5,5,5,5,5,5,5},n,m,clo;int dfs(int u,int s,int sz,int d){ if (vis[u][s][d]==clo) return dp[u][s][d]; vis[u][s][d]=clo; dp[u][s][d]=0; if (sz==1) { dp[u][s][d]=1; return dp[u][s][d]; } int cnt; for (int s1=s&(s-1);s1;s1=s&(s1-1)) { if (!(s1&(1<<u))) continue; cnt=0; for (int i=0;i<n;i++) if (s1&(1<<i)) cnt++; if (max(dep[cnt],dep[sz-cnt])+1>d) continue; for (int i=0;i<n;i++) if (((s^s1)&(1<<i))&&map[u][i]) dp[u][s][d]+=dfs(u,s1,cnt,d-1)*dfs(i,s^s1,sz-cnt,d-1); } return dp[u][s][d];}void solve(){ clo++; for (int i=0;i<n;i++) for (int j=0;j<n;j++) scanf("%d",&map[i][j]); printf("%d\n",dfs(m-1,(1<<n)-1,n,dep[n]));}int main(){ //freopen("d.in","r",stdin); while (scanf("%d%d",&n,&m)==2) solve();}
阅读全文
0 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
- 友盟分享(qq,qzone,微信,朋友圈)
- 写在开通CSDN博客的今天
- 相信java,更相信自己
- android新创建Activity在Manifest文件中注册,如何进行注册
- 聚类(Clustering)理论简介
- bzoj1399 Win
- ASP.NET读取设置Web.config文件--数据库
- 我的shell命令集锦
- Service Providers 服务提供者
- PhotoSwipe 图片浏览,可放大缩小,左右滑动
- 二叉树 链表实现 模板
- Anaconda 打开 ipynb 文件并可设置路径
- 链表实现冒泡排序
- 初步理解client/server