/*
好神奇好神奇...表示自己要学的还很多
注意到n<=9 不是搜索就是状丫
搜索+剪枝 70分 枚举放或者不放
这里用状丫 f[i][j][k] 表示前i行 放了j个国王 i行的状态是k的方案数
转移的话 枚举下层的状态 算出这个状态中有几个国王 然后更新
复杂度 2^n*2^n*n*K*n 最后一个n是算国王数 这个可以预处理搞出来
还有一个问题就是 互相伤害的问题
首先在同一行里 相邻的不行 不同行的就左移右移一下就好了 顺带处理好两个状态能不能互相转移
最后Σf[n][K][i]
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 520
using namespace std;
int n,K,v1[maxn],v2[maxn][maxn],cnt[maxn];
long long ans,f[][][maxn];
void Get_v()
{
for(int i=;i<(<<n);i++)
if((i&(i>>))==)
{
v1[i]=;int c=;
for(int j=i;j;j>>=)c+=j&;
cnt[i]=c;
}
for(int i=;i<(<<n);i++)if(v1[i])
for(int j=;j<(<<n);j++)if(v1[j])
if((i&j)==&&(i&(j>>))==&&(j&(i>>))==)
v2[i][j]=;
}
int main()
{
cin>>n>>K;
Get_v();
for(int i=;i<(<<n);i++)
f[][cnt[i]][i]=;
for(int i=;i<=n;i++)
for(int j=;j<(<<n);j++)if(v1[j])
for(int k=;k<(<<n);k++)if(v2[j][k])
for(int r=cnt[j];r+cnt[k]<=K;r++)
f[i][r+cnt[k]][k]+=f[i-][r][j];
for(int i=;i<(<<n);i++)
ans+=f[n][K][i];
cout<<ans<<endl;
return ;
}

codevs 2451 互不侵犯(状丫dp)的更多相关文章

  1. CODEVS 2451 互不侵犯

    2451 互不侵犯 题目描述 Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格 ...

  2. BZOJ1087[SCOI2005]互不侵犯——状压DP

    题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 输入 只有一行,包含两个数N,K ( ...

  3. NOI P1896 互不侵犯 状压DP

    题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 注:数据有加强(2018/4/25) ...

  4. P1896 [SCOI2005]互不侵犯 状压dp

    正解:状压dp 解题报告: 看到是四川省选的时候我心里慌得一批TT然后看到难度之后放下心来觉得大概没有那么难 事实证明我还是too young too simple了QAQ难到爆炸TT我本来还想刚一道 ...

  5. SCOI2005 互不侵犯 [状压dp]

    题目传送门 题目大意:有n*n个格子,你需要放置k个国王使得它们无法互相攻击,每个国王的攻击范围为上下左走,左上右上左下右下,共8个格子,求最多的方法数 看到题目,是不是一下子就想到了玉米田那道题,如 ...

  6. [SCOI2005]互不侵犯 (状压$dp$)

    题目链接 Solution 状压 \(dp\) . \(f[i][j][k]\) 代表前 \(i\) 列中 , 已经安置 \(j\) 位国王,且最后一位状态为 \(k\) . 然后就可以很轻松的转移了 ...

  7. luogu1896 [SCOI2005]互不侵犯 状压DP

    题目大意 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子.( 1 <=N <=9, 0 ...

  8. Codevs 2800 送外卖(状压DP)

    2800 送外卖 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有一个送外卖的,他手上有n份订单,他要把n份东西,分别送达n ...

  9. _bzoj1087 [SCOI2005]互不侵犯King【dp】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1087 令f(i, j, k)表示前i列,二进制状态为j,已经用了k个国王的方案数,则 f(i ...

随机推荐

  1. 理解javascript之 对象

    大纲: 1.介绍attribute property的异同,翻译自http://javascript.info/tutorial/attributes-and-custom-properties#pr ...

  2. 两个示例介绍JavaScript的闭包

    JavaScript的闭包有两个用途:一个是访问函数内部的变量:另一个是让变量的值在作用域内保持不变.函数是JavaScript 中唯一有作用域的对象,因此JavaScript的闭包依赖于函数实现,下 ...

  3. js 超级玛丽(未完成)

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  4. GFStableList Adapter

    STL中,list的优点是插入.删除性能极佳(时间复杂度只需O(1)即可),而且非常重要的在删除节点后,其迭代器不失效,但list查找却不擅长.map由于其实现的数据结构为rb-tree,因此,其插入 ...

  5. Rotate List 面试题

    今天做了leetcode的Rotate List,刚开始头脑不清楚,写的乱七八糟的,后来改了下,提交了,能过,把代码贴出来. 做题的时候头脑要清楚,我刚开始做完的时候才发现我把向左向右移动弄反了,后来 ...

  6. UVA - 524 Prime Ring Problem(dfs回溯法)

    UVA - 524 Prime Ring Problem Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & % ...

  7. Linux shell (一)

    echo -e "Hello World! \a \n"     # -e 解析反斜杠 read -p "Please input your first name: &q ...

  8. java的占位符

    java占位符的类型: 常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象.熟悉C语言的同学应该记得C语言的sprintf()方法,两者有类似之处.fo ...

  9. 转:FIFO的定义与作用

    一.先入先出队列(First Input First Output,FIFO)这是一种传统的按序执行方法,先进入的指令先完成并引退,跟着才执行第二条指令. 1.什么是FIFO? FIFO是英文Firs ...

  10. Asteroids

    http://poj.org/problem?id=3041 #include<cstdio> #include<cstring> #include<algorithm& ...