【58.75%】【BZOJ 1087】[SCOI2005]互不侵犯King
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 3040 Solved: 1786
[Submit][Status][Discuss]
Description
在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上
左下右上右下八个方向上附近的各一个格子,共8个格子。
Input
只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K <= N * N)
Output
方案数。
Sample Input
Sample Output
【题解】
设f[i][j][k]表示在第i行的放国王的序列为k,然后前i行放了j个国王的方案数;
f[i][j][k] = ∑[i-1][j-count[k]][pre_zhuangtai];
然后就是pre_zhuangtai 要怎么和k状态配对呢?
就是说你怎么知道这两行的国王不会发生冲突?
可以用dfs预处理出来。
然后用碉堡了的位运算来获取不合法的关系。剩下的就是合法的了。
1
1
1
01
01
10
像上面3个都是不合法的会发现
x<<1 x>>1 x 分别和y进行&运算。如果大于0.就是不合法的了。
记录下某两个状态是不是合法的就可以了。
【代码】
#include <cstdio>
#include <cstring> const int MAXN = 101; int n, k, n_zt = 0, zt[MAXN], count[MAXN];
long long f[10][101][101];
bool can[MAXN][MAXN]; void dfs(int num, int pre, int zhuangtai)
{
n_zt++;
zt[n_zt] = zhuangtai;
count[n_zt] = num;
if (num >= k)
return;
for (int i = pre + 2; i <= n; i++)
dfs(num + 1, i, zhuangtai + (1 << (i - 1)));
} int main()
{
//freopen("F:\\rush.txt", "r", stdin);
memset(can, true, sizeof(can));
scanf("%d%d", &n, &k);
dfs(0, -1, 0);
for (int i = 1; i <= n_zt; i++)
for (int j = 1; j <= n_zt; j++)
if ((zt[i] & zt[j]) || ((zt[i] << 1) & zt[j]) || ((zt[i] >> 1) & zt[j]))
can[j][i] = can[i][j] = false;
for (int i = 1; i <= n_zt; i++)
f[1][count[i]][i] = 1;
for (int i = 2;i <= n;i++)//枚举当前是第几行。
for (int j = 0;j <= k;j++)//枚举当总共放了多少个国王
for (int now = 1; now <= n_zt; now++)//枚举当前行的状态是什么
{
if (j < count[now])//如果枚举当前行状态的国王数目大于当前枚举的则跳过。
continue;
for (int prezt = 1; prezt <= n_zt; prezt++)//枚举前一行的状态是什么
if (can[prezt][now] && count[prezt] + count[now] <= j)
f[i][j][now] += f[i - 1][j - count[now]][prezt];
//如果这两行符合规则.且前一行的国王的数目加上这一行的国王的数目小于等于
//当前枚举的车的数目;
//这一行贡献了count[now]个国王。则前i-1行贡献了j-count[now]个国王.
}
long long ans = 0;
for (int i = 1; i <= n_zt; i++)
ans += f[n][k][i];
printf("%lld\n", ans);
return 0;
}
【58.75%】【BZOJ 1087】[SCOI2005]互不侵犯King的更多相关文章
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- bzoj 1087 [SCOI2005]互不侵犯King 状态压缩dp
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MB[Submit][Status][Discuss] Descripti ...
- bzoj[1087][SCOI2005]互不侵犯King
Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包 ...
- bzoj 1087: [SCOI2005]互不侵犯King【状压dp】
显然是状压,设f[i][j][k]为1到i行选j个king,并且第i行状态为k的方案数,判断是否可行然后枚举转移即可 先把可行状态预处理出来会变快 #include<iostream> # ...
- BZOJ 1087 [SCOI2005]互不侵犯King(状压DP)
题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子.n<=9 思路:状压dp,dp[i][ ...
- BZOJ 1087 [SCOI2005]互不侵犯King ——状压DP
[题目分析] 沉迷水题,吃枣药丸. [代码] #include <cstdio> #include <cstring> #include <iostream> #i ...
- 1087: [SCOI2005]互不侵犯King
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4276 Solved: 2471[Submit][ ...
- 【BZOJ】1087: [SCOI2005]互不侵犯King(状压dp)
http://www.lydsy.com:808/JudgeOnline/problem.php?id=1087 状压dp是第一次写啊,我也是才学TAT.状压dp一般都用一个值表示集合作为dp的一个状 ...
- 【BZOJ】1087: [SCOI2005]互不侵犯King
[算法]状态压缩型DP [题解]http://www.cnblogs.com/xtx1999/p/4620227.html (orz) https://www.cnblogs.com/zbtrs/p/ ...
- 1087. [SCOI2005]互不侵犯King【状压DP】
Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上 左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行, ...
随机推荐
- java8 各种时间转换方法
java8 各种时间转换方法 本来按照常理日期时间是一个很简单的东西,只需要根据一个时间戳就可以算出当前的时间了.但这其实只是初级的想法,是因为你的项目还没有到跨时区部署的程度,一旦你的项目要部署到其 ...
- 轻松搞定word中让人抓狂的自动编号
在word中使用自动编号时,如果一级编号是2,想让其后面的二级编号自动编号为2.1.2.2--,三级编号自动编号为2.1.1.2.1.2--:且在该一级编号调整为3时,后面的二级编号和三级编号的第一位 ...
- JavaScript 验证API
约束验证 DOM 方法 Property Description checkValidity() 如果 input 元素中的数据是合法的返回 true,否则返回 false. setCustomVal ...
- 修改oracle编码格式
文章参照:https://www.jb51.net/article/53078.htm 1.查看oracle当前编码格式: SELECT * FROM V$NLS_PARAMETERS WHERE P ...
- 关于Spring+mybatis+PageHelper分页插件PageHelper的使用策略
把插件jar包导入项目(具体上篇有介绍http://blog.csdn.net/qq_33624284/article/details/72821811) spring-mybatis.xml文件中配 ...
- 关于使用JavaMail发送邮件
import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import javax.activati ...
- @bzoj - 3749@ [POI2015] Łasuchy
目录 @description@ @solution@ @version - 1@ @version - 2@ @accepted code@ @version - 1@ @version - 2@ ...
- vscode golang vue配置
{ "files.autoSave": "off", "window.title": "${dirty}${activeEdito ...
- Eclipsed的SVN插件不能识别之前工作空间的项目
今天用Eclipse的SVN插件,由于之前项目是用"tortoisesvn"进行checkout的,并且已经在工作空间中使用.后来用来Ecplise的SVN插件,可是发现右键Tea ...
- linux下oracle查询中文乱码
export NLS_LANG=AMERICAN_AMERICA.UTF8