【状态压缩dp】bzoj1087 互不侵犯
2015-10-09 17:21
375 查看
马上就要在bzoj上切掉30道水题啦~大家共同进步~
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1087
题目大意:求在N*N(N≤9)的棋盘上放K个互不攻击的国王的方案数
果断dp,dp[i][j][k]代表前i行放k个国王,前一行放的格式为j(j为二进制数),的方案数,转移的时候要判断是否有国王互相攻击
设本行要放的方案为p,如果(p and j)、(p and (j/2))、(p and (j*2))均为0,那么不会互相攻击,但是注意下每行中不能连续放置两个国王,否则也会互相攻击的~(我会说我因为这个WA了一次吗= =)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1087
题目大意:求在N*N(N≤9)的棋盘上放K个互不攻击的国王的方案数
果断dp,dp[i][j][k]代表前i行放k个国王,前一行放的格式为j(j为二进制数),的方案数,转移的时候要判断是否有国王互相攻击
设本行要放的方案为p,如果(p and j)、(p and (j/2))、(p and (j*2))均为0,那么不会互相攻击,但是注意下每行中不能连续放置两个国王,否则也会互相攻击的~(我会说我因为这个WA了一次吗= =)
[code]#include <iostream> #define ll long long using namespace std; ll dp[20][1000][100]; int c[1000]; bool b[1000]; int js[20]; int main() { int n,m; cin >> n >> m; js[1] = 1; for(int i = 2;i <= 12;i ++) js[i] = js[i-1] * 2; for(int i = 1;i <= 12;i ++) for(int j = 1;j <= js[n+1]-1;j ++) if((js[i]&j)) { c[j] ++; if((j&js[i+1])) b[j] = 1; } for(int i = 0;i <= js[n+1]-1;i ++) if(!b[i]) dp[1][i][c[i]] = 1; for(int k = 1;k < n;k ++) for(int i = 0;i < js[n+1];i ++) for(int j = 0;j < js[n+1];j ++) if(!(i&j) && !((i/2)&j) && !((i*2)&j) && !b[j]) for(int l = 0;l <= m;l ++) dp[k+1][j][l+c[j]] += dp[k][i][l]; ll ans = 0; for(int i = 0;i <= js[n+1]-1;i ++) ans += dp [i][m]; cout << ans << endl; return 0; }
相关文章推荐
- MyBatis入门07--实现sql动态模糊查询
- 简单搞定listview下拉加载更多
- Linux C++编译 错误:‘std::tr1’尚未声明
- Dubbo框架应用之(三)--Zookeeper注册中心、管理控制台的安装及讲解
- Javascript 闭包中的this
- android-async-http AsyncHttpClient介绍
- web api 初体验 解决js调用跨域问题
- Javascript数组操作
- jquery操作select(取值,设置选中)
- opencv源码:cascadedetect
- ubuntu14.04 上使用glfw
- HTML iframe 用法总结收藏
- ADB Shell Commands,个人翻译,多多指点
- welcome,bro!
- 全面了解 iOS 静态库开发
- 软件测试常用术语
- error C4996: 'swprintf': swprintf has been changed to conform with the ISO C standard,set _CRT_NON_CONFORMING_SWPRINT
- 线程同步 wait 和 notify 使用例子
- VMDK镜像迁移到KVM(二)
- 关于coreAnimation 核心动画的学习笔记(5)