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 ...
随机推荐
- XAMPP PHP redis 扩展
1.php增加redis扩展 echo phpinfo();exit;查看php 版本以及 vc运行库 可知 X86 MSVC11 PHP5.6 首先把对应版本的php_redis.dll 和 ...
- MySql注入科普
默认存在的数据库: mysql 需要root权限读取 information_schema 在5以上的版本中存在 测试是否存在注入方法 假:表示查询是错误的 (MySQL 报错/返回页面与原来不同) ...
- iOS 深浅拷贝
-(void)copyDemo { // 在非集合类对象中:对immutable对象进行copy操作,是指针复制,mutableCopy操作时内容复制:对mutable对象进行copy和mutable ...
- ng-bind-html 的原素没有高度
angularjs里绑定html元素,在页面的div里使用ng-bind-html <!-- html--> <div class="info" ng-bind- ...
- FIO是测试IOPS
FIO是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证,支持13种不同的I/O引擎,包括:sync,mmap, libaio, posixaio, SG v3, splice, null, ...
- ios每日一发--Leanclude数据云存储以及登录 注册账户
利用LeanCloud来实现注册账号,存储账号以及,登录时查询账号是否正确.集成方式很简单可以看这里的官方文档.地址是这里: https://leancloud.cn/docs/ 在这里创建应用,以及 ...
- RDIFramework.NET V2.8版本 ━ 开发实例之产品管理(WinForm)
RDIFramework.NET V2.8版本 ━ 开发实例之产品管理(WinForm) 现在,我们使用.NET快速开发整合框架(RDIFramework.NET)来开发一个应用,此应用皆在说明如何使 ...
- Life is hard
Life is hard, always so.If there's anything to give you a hard life with sunshine and warmth, please ...
- paper 104: 彩色图像高速模糊的懒惰算法
工程及源代码:快速模糊.rar 图像模糊算法有很多种,我们最常见的就是均值模糊,即取一定半径内的像素值之平均值作为当前点的新的像素值,在一般的工业 ...
- css3创建一个上下线性渐变色背景的div
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title> ...