洛谷P1896 互不侵犯
又是一道状压DP求方案数的题...
多了一个放k个的限制,于是我们把数组多开一维。
f[i][j][k]表示前i行放了j个,第i行状态为k的方案数。
然后老套路DFS转移,这次要多记录一个cnt表示上一行的棋子数。
然后因为什么都不放也是可以转移的,所以我们输出f[m + 1][k][0]即为最终答案。
中间有个num数组是指这个状态有多少个棋子。
#include <cstdio> typedef long long LL;
const int N = ; LL f[N + ][][ << N], ans;
int pre, m, num[ << N], cnt, k; inline int check(int s) {
int a = ;
while(s) {
a += s & ;
s >>= ;
}
return a;
} void DFS(int x, int y, int ns) {
if(y >= m) {
f[x][cnt + num[ns]][ns] += ans;
return;
}
DFS(x, y + , ns);
if(!y) {
if(!((pre >> y) & ) && !((pre >> (y + )) & ) && cnt + num[ns] < k) {
DFS(x, y + , ns | );
}
return;
}
if(!((ns >> (y - )) & ) && !((pre >> (y - )) & ) && !((pre >> y) & ) && !((pre >> (y + )) & ) && cnt + num[ns] < k) {
DFS(x, y + , ns | ( << y));
}
return;
} int main() {
scanf("%d%d", &m, &k);
int lm = << m;
for(int i = ; i < lm; i++) {
num[i] = check(i);
}
f[][][] = ;
for(int i = ; i <= m + ; i++) {
for(int j = ; j < lm; j++) {
for(int p = ; p <= k; p++) {
if(!f[i - ][p][j]) {
continue;
}
ans = f[i - ][p][j];
pre = j;
cnt = p;
DFS(i, , );
}
}
} printf("%lld", f[m + ][k][]);
return ;
}
AC代码
洛谷P1896 互不侵犯的更多相关文章
- 洛谷 P1896 互不侵犯King
P1896 [SCOI2005]互不侵犯King 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共 ...
- 状压DP概念 及例题(洛谷 P1896 互不侵犯)
状压DP 就是状态压缩DP.所谓状态压缩,就是将一些复杂的状态压缩起来,一般来说是压缩为一个二进制数,用01来表示某一元素的状态. 比如一排灯泡(5个) 我们可以用一串二进制01串来表示他们的状态 1 ...
- 洛谷 P1896 [SCOI2005]互不侵犯
洛谷 P1896 [SCOI2005]互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8 ...
- 【题解】洛谷P1896 [SCOI2005] 互不侵犯(状压DP)
洛谷P1896:https://www.luogu.org/problemnew/show/P1896 前言 这是一道状压DP的经典题 原来已经做过了 但是快要NOIP 复习一波 关于一些位运算的知识 ...
- 洛谷P1896||bzoj1087 [SCOI2005]互不侵犯
bzoj1087 洛谷P1896 想了很久,太久没做状压都已经不会了... 状压每一行就好了 #include<cstdio> #include<algorithm> #inc ...
- 状压DP【洛谷P1896】 [SCOI2005]互不侵犯
P1896 [SCOI2005]互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子 ...
- 洛谷P1896 [SCOI2005]互不侵犯King
P1896 [SCOI2005]互不侵犯King 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共 ...
- 洛谷——P1896 [SCOI2005]互不侵犯
P1896 [SCOI2005]互不侵犯 状压DP入门题 状压DP一般需要与处理状态是否合法,节省时间 设定状态dp[i][j][k]表示第i行第j个状态选择国王数为k的方案数 $dp[i][j][n ...
- BZOJ1087=Codevs2451=洛谷P1896&P2326互不侵犯
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2885 Solved: 1693[Submit][ ...
随机推荐
- Eclipse的一个“bug”
标题之所以打上双引号,是因为暂时不知道怎么确定. 一个 .java文件里有两个类:public Bath:Soap.它们都有一个main()方法. 从命令行单独访问任意一个类的main()方法,都没毛 ...
- 安装MongoDB(做成Windows服务)并加载C#驱动程序
一 Mongodb简介: 通过查询网上的一些信息来介绍一下Mongodb的优势:MongoDB是一个面向文档的数据库,目前由10gen开发并维护,它的功能丰富,齐全,完全可以替代MySQL.在使用Mo ...
- python设计模式第二十二天【备忘录模式】
1.应用场景 (1)能保存对象的状态,并能够恢复到之前的状态 2.代码实现 #!/usr/bin/env python #! _*_ coding:UTF-8 _*_ class Originator ...
- swagger bug
https://blog.csdn.net/u011943534/article/details/81778125 处理swagger报错Could not resolve pointer: /def ...
- tornado.gen.coroutine-协程
http://blog.csdn.net/seeground/article/details/49488281
- 在delphi中生成GUID
什么是 GUID ? 全球唯一标识符 (GUID) 是一个字母数字标识符,用于指示产品的唯一性安装.在许多流行软件应用程序(例如 Web 浏览器和媒体播放器)中,都使用 GUID. GUID 的格式为 ...
- Vue之动态绑定CSS样式
demo.html <!DOCTYPE html> <html lang="en" xmlns:v-bind="http://www.w3.org/19 ...
- C# json解析
json格式数 [{ , , , "ItemCode": "UBAC11211OF-A54", "basicName_bg": " ...
- Data Science With R In Visual Studio
R Projects Similar to Python, when we installed the data science tools we get an “R” section in our ...
- hdu-1358(kmp)
题意:给你一个长度为n的字符串,问你一共有多少Xi——从0开始到Xi的这段长度这个字符子串是循环串,并输出最多的循环节的次数: 解题思路:用kmp的next数组,我们从next数组的值中可以看出这个字 ...