HDU-4529 郑厂长系列故事——N骑士问题 状态压缩DP
题意:给定一个合法的八皇后棋盘,现在给定1-10个骑士,问这些骑士不能够相互攻击的拜访方式有多少种。
分析:一开始想着搜索写,发现该题和八皇后不同,八皇后每一行只能够摆放一个棋子,因此搜索收敛的很快,但是骑士的话就需要对每一个格子分两种情况进行,情况非常的多,搜索肯定是会超时的。状态压缩DP就是另外一个思路的,理论上时间复杂度是8*n*2^24,但是由于限制比较多,也就能够解决了。设dp[i][j][p][q]表示第i-1行压缩后的状态是p,第i行压缩后的状态为q,且之前一共使用了j个骑士的方案数。按照题意递推即可。
#include <cstdio>
#include <cstring>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; const int LIM = <<;
const int M = ;
int n;
int dp[][M+][LIM][LIM];
// dp[i][j][p][q]表示第i-1行状态为p,第i行状态为q,并且一共使用j个骑士的状态数
int G[M];
int tot[LIM];
char f1[LIM][LIM]; // 相邻两层两个状态之间是否冲突
char f2[LIM][LIM]; // 与上上行两个状态之间是否冲突 void pre() {
for (int i = ; i < LIM; ++i) {
for (int j = ; j < ; ++j) {
if (i & ( << j)) ++tot[i];
}
for (int j = ; j < LIM; ++j) {
if ((i>>)&j || (j>>)&i) f1[i][j] = ;
if ((i>>)&j || (j>>)&i) f2[i][j] = ;
}
}
} void solve() {
int cur = , nxt = ;
memset(dp, , sizeof (dp));
dp[cur][][][] = ;
for (int i = ; i < ; ++i) { // 由dp[i]来推导dp[i+1]
for (int j = ; j <= n; ++j) {
for (int p = ; p < LIM; ++p) {
for (int q = ; q < LIM; ++q) {
if (!dp[cur][j][p][q]) continue;
for (int z = ; z < LIM; ++z) {
if ((z & G[i+]) != z) continue;
if (tot[z] + j > n) continue;
if (i >= && f1[q][z]) continue;
if (i >= && f2[p][z]) continue;
dp[nxt][tot[z]+j][q][z] += dp[cur][j][p][q];
}
}
}
}
memset(dp[cur], , sizeof (dp[cur]));
swap(cur, nxt);
}
int ret = ;
for (int i = ; i < LIM; ++i) {
for (int j = ; j < LIM; ++j) {
ret += dp[cur][n][i][j];
}
}
printf("%d\n", ret);
} int main() {
int T;
char str[];
pre();
scanf("%d", &T);
while (T--) {
memset(G, , sizeof (G));
scanf("%d", &n);
for (int i = ; i <= ; ++i) {
scanf("%s", str);
for (int j = ; j < ; ++j) {
G[i] <<= ;
if (str[j] == '.') G[i] |= ;
}
}
solve();
}
return ;
}
HDU-4529 郑厂长系列故事——N骑士问题 状态压缩DP的更多相关文章
- HDU 4529 郑厂长系列故事——N骑士问题 状压dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4529 郑厂长系列故事--N骑士问题 Time Limit: 6000/3000 MS (Java/O ...
- HDU4529 郑厂长系列故事——N骑士问题 —— 状压DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4529 郑厂长系列故事——N骑士问题 Time Limit: 6000/3000 MS (Java/Ot ...
- HDU 4539 郑厂长系列故事——排兵布阵 状压dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4539 郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/O ...
- HDU 4539 郑厂长系列故事——排兵布阵 —— 状压DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4539 郑厂长系列故事——排兵布阵 Time Limit: 10000/5000 MS (Java/Ot ...
- hdu_4529_郑厂长系列故事——N骑士问题(状压DP)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4529 题意:中文,不解释 题解:状压DP,dp[i][j][k][s]表示第i行当前用了j个骑士,i- ...
- HDU 4539郑厂长系列故事――排兵布阵(状压DP)
HDU 4539 郑厂长系列故事――排兵布阵 基础的状压DP,首先记录先每一行可取的所哟状态(一行里互不冲突的大概160个状态), 直接套了一个4重循环居然没超时我就呵呵了 //#pragma co ...
- HDU 4539 郑厂长系列故事——排兵布阵
http://acm.hdu.edu.cn/showproblem.php?pid=4539 郑厂长系列故事——排兵布阵 Time Limit: 10000/5000 MS (Java/Others) ...
- hdu 4524 郑厂长系列故事——逃离迷宫 小水题
郑厂长系列故事——逃离迷宫 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) To ...
- POJ 1185 - 炮兵阵地 & HDU 4539 - 郑厂长系列故事——排兵布阵 - [状压DP]
印象中这道题好像我曾经肝过,但是没肝出来,现在肝出来了也挺开心的 题目链接:http://poj.org/problem?id=1185 Time Limit: 2000MS Memory Limit ...
随机推荐
- 验证一个字符串是否由数字组成(Java)
public class StringDemo{ public static void main(String args[]){ String str ="12343264sd6223&qu ...
- wpf 将Style应用到 ListView 中的 ListViewItem 元素
例: 为每个条目元素设置右键菜单 1. 新建右键菜单元素和样式元素 注意: 同时设置样式元素的 TargetType 属性和 x:Key 属性, 将样式元素限定为应用于 ListViewItem 类型 ...
- python时间操作总结
Unix时间戳 Unix时间戳(Unix timestamp),或称Unix时间(Unix time).POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月 ...
- c#创建、安装、卸载、调试windows服务的简单事例
最近工作中用到了windows服务,对其有深刻理解和丰富经验谈不上,本篇文章只是简单陈诉用c#创建.安装.卸载.调试windows服务的步骤. 一.创建windows服务 1.用VS创建windows ...
- Bugzilla说明
简介 Bugzilla是Mozilla公司向我们提供的一个开源的免费缺陷跟踪工具.作为一个产品缺陷的记录及跟踪工具,它能够为你建立一个完善的Bug跟踪体系,包括报告Bug.查询Bug记录并产生报表.处 ...
- angularJs自定义指令.directive==类似自定义标签
创建自定义的指令 除了 AngularJS 内置的指令外,我们还可以创建自定义指令. 你可以使用 .directive 函数来添加自定义的指令. 要调用自定义指令,HTML 元素上需要添加自定义指令名 ...
- easyui combobox级联(转载)
一.创建combobox 有如下几种方式可以创建一个combobox 1.使用select标签,并加上class="easyui-combobox",这种方式比较适用于静态的选项. ...
- JSP中的隐式对象(implicit object)
- selenium and win32api
I:Web 测试 selenium-2.45.0 python 2.7.8 win32api http://sourceforge.net/projects/pywin32/files/pywin32 ...
- c#大文件分割过程
需求: 在项目开发中,我们会遇到单个文件大小超过1TB的文件,这样的文件只能进行单文件读取,往往会造成读取完成耗时过长,导致客户在使用体验过程中不满意. 为了解决提升大文件的解析速度,我想到了先分割大 ...