SGU223 状态压缩DP
2013-11-14 14:31
239 查看
问在棋盘上放置K个国王,让其不能够互相攻击的放置方法有多少种
国王可以攻击周围的8个格子
dp[i][j][k] 表示前i行防止j个国王,且第i行状态s的情况下放置的方案数。
状态压缩dp的关键一是找到完整的描述状态的方式 本题不但要描述最后一行,还要描述现在总共放置了多少个国王
关键二是找出合法的状态转移方式。本题中一行中可能的状态方式先枚举出来10的时候总共不过200,然后把每种可能的状态转移也保存下来,放在s中,这样就不用重复
国王可以攻击周围的8个格子
dp[i][j][k] 表示前i行防止j个国王,且第i行状态s的情况下放置的方案数。
状态压缩dp的关键一是找到完整的描述状态的方式 本题不但要描述最后一行,还要描述现在总共放置了多少个国王
关键二是找出合法的状态转移方式。本题中一行中可能的状态方式先枚举出来10的时候总共不过200,然后把每种可能的状态转移也保存下来,放在s中,这样就不用重复
#include<stdio.h> #include<string.h> #include<vector> using namespace std; int state[200]; int c[200]; vector<int> s[200]; long long dp[11][101][300]; int main() { int n,k; while(scanf("%d%d",&n,&k)!=EOF) { memset(s,0,sizeof(s)); int count=0; for(int i=0;i<(1<<n);i++) { if((i&(i<<1))==0) { int t=i; int tc=0; while(t) { tc++; t-=((t)&(-t)); } c[count]=tc; state[count++]=i; } } for(int i=0;i<count;i++) { for(int j=0;j<count;j++) { if((state[i]&state[j])==0&&(state[i]&(state[j]<<1))==0&&(state[i]&(state[j]>>1))==0) { s[i].push_back(j); } } } /* for(int i=0;i<count;i++) { printf("%d:",state[i]); for(int j=0;j<s[i].size();j++) { printf("%d ",state[s[i][j]]); } puts(""); } */ memset(dp,0,sizeof(dp)); dp[0][0][0]=1; for(int i=0;i<n;i++) { for(int j=0;j<=k;j++) { for(int o=0;o<count;o++) { if(dp[i][j][o]) { for(int p=0;p<s[o].size();p++) { int ns=s[o][p]; dp[i+1][j+c[ns]][ns]+=dp[i][j][o]; } } } } } long long ans=0; for(int i=0;i<count;i++) ans+=dp [k][i]; printf("%lld\n",ans); } return 0; }
相关文章推荐
- unity --项目总结-1
- Android 4.0 源码目录结构
- 64 SUSE 下GCC 4.8.2 编译的 skipping incompatible 问题
- EF直接更新数据(不需查询)
- SharePoint 2010新手入门(2) -- 基本概念
- Adobe Illustrator CC下的插件开发之UI
- linux平台开发有用的一些知识点. 持续更新.
- endUpdates
- String,StringBuffer,StringBuilder的区别
- 黑马程序员:GUI介绍:布局管理器、Frame、事件监听机制、Action事件、鼠标键盘事件、菜单、jar包的双击执行
- 程序员应该学习的签名破解
- SDN无层网络与TCP/IP分层网络
- JAVA hashCode使用方法详解
- sccm2012 Client Uninstall
- 通过cell的UIButton获取UITableViewCell的行数及Cell数据
- 任务栏发送消息
- android下ListView的奇异异常大集合(持续更新)
- Pro Android学习笔记(五五):调试和分析(3):adb命令、模拟器控制台和StrictMode
- search or reseed identity columns in sqlserver 2008
- 修改phpMyAdmin使其能够管理多台远程MySQL服务器