bzoj 1087 状压dp
1087: [SCOI2005]互不侵犯King
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 4130 Solved: 2390
[Submit][Status][Discuss]
Description
在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上
左下右上右下八个方向上附近的各一个格子,共8个格子。
Input
只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K <= N * N)
Output
方案数。
Sample Input
Sample Output
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
using namespace std;
#define LL long long
LL dp[][][<<],cnt[];
bool e[][],q[];
int N,M;
bool pd(int A,int B)
{
bool hurt[]; memset(hurt,,sizeof(hurt));
for(int i=;i<;++i)
if(A&(<<i)) hurt[i++]=hurt[i-+]=hurt[i+]=;
for(int i=;i<;++i)
if( (B&(<<i)) && hurt[i+]) return ;
return ;
}
void pre()
{
for(int i=;i<(<<);++i){ int ss=;
for(int j=;j<;++j) if(i&(<<j)) ss++;
cnt[i]=ss;
}
for(int i=;i<(<<);++i){int ok=;
for(int j=;j<;++j){
if((i&(<<j))&&(i&(<<(j+)))){ok=;break;}
}
q[i]=ok;
}
for(int i=;i<(<<);++i){
for(int j=;j<(<<);++j){
if((!q[i])||(!q[j])) {e[i][j]=;}
else {
if(pd(i,j)) {e[i][j]=; }
}
}
}
}
int main()
{
pre();
int i,j,k;
scanf("%d%d",&N,&M);
dp[][][]=;
for(i=;i<=N;++i)
{
for(k=;k<=M;++k)
{
for(int A=;A<(<<N);++A){
for(int B=;B<(<<N);++B){
if(e[A][B]&&k-cnt[B]>=){
dp[i][k][B]+=dp[i-][k-cnt[B]][A];
}
}
}
}
}LL ans=;
for(i=;i<(<<N);++i) ans+=dp[N][M][i];
printf("%lld\n",ans);
return ;
}
bzoj 1087 状压dp的更多相关文章
- bzoj 1879 状压dp
879: [Sdoi2009]Bill的挑战 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 852 Solved: 435[Submit][Status ...
- BZOJ 2064 - 状压DP
传送门 题目大意: 给两个数组, 数组中的两个元素可以合并成两元素之和,每个元素都可以分裂成相应的大小,问从数组1变化到数组2至少需要多少步? 题目分析: 看到数据范围\(n<=10\), 显然 ...
- BZOJ 4057 状压DP
思路: 状压一下 就完了... f[i]表示选了的集合为i 转移的时候判一判就好了.. //By SiriusRen #include <cstdio> #include <cstr ...
- BZOJ 4565 状压DP
思路: f[i][j][S]表示从i到j压成S状态 j-m是k-1的倍数 $f[i][j][S<<1]=max(f[i][j][S<<1],f[i][m-1][S]+f[m][ ...
- bzoj 1072状压DP
1072: [SCOI2007]排列perm Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2293 Solved: 1448[Submit][St ...
- bzoj 1072 状压DP
我们用w[i][j]来表示,i是一个二进制表示我们选取了s中的某些位,j表示这些位%d为j,w[i][j]则表示这样情况下的方案数,那么我们可以得到转移.w[i|(1<<k)][(j*10 ...
- bzoj 2669 状压DP
因为最多有8个'X',所以我们可以用w[i][s]来表示现在我们填了前i个数,填的X的为S,因为每次新加进来的数都不影响前面的最小值,所以我们可以随便添加,这样就有了剩下所有位置的方案,每次都这样转移 ...
- bzoj 1076 状压DP
我们设w[i][s]为当前到第i关,手中的物品为s的时候,期望得分为多少,其中s为二进制表示每种物品是否存在. 那么就比较容易转移了w[i][s]=(w[i-1][s']+v[j]) *(1/k),其 ...
- BZOJ 1231 状压DP
思路: f[i][j] i表示集合的组成 j表示选最后一个数 f[i][j]表示能选的方案数 f[i|(1<< k)][k]+=f[i][j]; k不属于i j属于i且符合题意 最后Σf[ ...
随机推荐
- css 自定义滚动条
我遇到的场景: 对于iframe窗口,自带滚动条是整个窗口的大小.有时需要顶部或底部固定,则滚动条不应该触碰到顶部或底部. 那么首先打开iframe时应该去掉滚动条 scrolling="n ...
- 微信小程序组件toast
操作反馈toast:官方文档 Demo Code: var toastNum = 2 var pageData = {} pageData.data = {} for(var i = 0; i < ...
- gitHub新项目的上传
github作为一个开源托管平台,除了有机会学习各位大神的开源项目,还能托管自己写的一些小Demo,作为github新进菜鸟,今天就整理下上传Demo所需的命令和操作步骤,防止我这谜一样的记忆力. 1 ...
- BZOJ 5427: 最长上升子序列
$f[i] 表示长度为i的最长上升子序列的最后一位的最小值是多少$ 对于普通的$LIS我们可以二分确定位置去更新$ 再来考虑对于这个,如果有某一位没有确定的话 那么这一位是可以随便取的,也就是说,所有 ...
- Codeforces Round #408 (Div. 2) D - Police Stations
地址:http://codeforces.com/contest/796/problem/D 题目: D. Police Stations time limit per test 2 seconds ...
- yarn nodes label (yarn 划分子集群)
yarn node labels 特性给节点打标签可以把特性类似的节点分成一组,这样可以指定特定的应用执行在特定的机器群上.现在我们只支持节点划分,1.一个节点仅能有一个节点划分,即一个节点只能打一个 ...
- spray-json
spray-json是一个轻量级的,简介的和高效的使用Scala实现的json 它拥有以下特征: 一个简单不可变的模型的json语言元素 一个高效的json解析器 可选择既紧凑又漂亮的json到str ...
- 对 META标签 的一点点了解
①META标签是啥 META标签,是HTML语言head区的一个辅助性标签.在几乎所有的page里,我们都可以看 到类似下面这段html代码: ---------------------------- ...
- 判断变量是否为 NaN
首先要明确 NaN 的一个特性, NaN不能用相等操作符(== 和 ===) 来判断, NaN === NaN 会返回 false: 下面是测试代码: console.log(isNaN('1')) ...
- python中统计计数的几种方法
以下实例展示了 count() 方法的使用方法: 1 2 3 4 5 6 # !/usr/bin/python3 T = (123, 'Google', 'Runoob', 'Taobao', 1 ...