HDU4529 郑厂长系列故事——N骑士问题 —— 状压DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4529
郑厂长系列故事——N骑士问题
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 642 Accepted Submission(s): 315
也不是副厂长
他根本就不是厂长
还是那个腾讯公司的码农
一个业余时间喜欢下棋的码农
最近,郑厂长对八皇后问题很感兴趣,拿着国际象棋研究了好几天,终于研究透了。兴奋之余,坐在棋盘前的他又开始无聊了。无意间,他看见眼前的棋盘上只摆了八个皇后,感觉空荡荡的,恰好又发现身边还有几个骑士,于是,他想把这些骑士也摆到棋盘上去,当然棋盘上的一个位置只能放一个棋子。因为受八皇后问题的影响,他希望自己把这些骑士摆上去之后,也要满足每2个骑士之间不能相互攻击。
现在郑厂长想知道共有多少种摆法,你能帮助他吗?
骑士的下法:
每步棋先横走或直走一格,然后再往外斜走一格;或者先斜走一格,最后再往外横走或竖走一格(即走“日”字)。可以越子,没有"中国象棋"的"蹩马腿"限制。
每组数据首先是一个整数N(1<=n<=10),表示要摆N个骑士上去;
接下来是一个8*8的矩阵来描述一个棋盘,’.’表示这个位置是空的,’*’表示这个位置上已经放了皇后了;
数据中的初始棋盘保证是一个合法的八皇后摆法。
1
*.......
....*...
.......*
.....*..
..*.....
......*.
.*......
...*....
2
*.......
....*...
.......*
.....*..
..*.....
......*.
.*......
...*....
1409
题解:
1.与此题(POJ1185 炮兵阵地)类似。
2.设dp[i][j][s1][s2]为:到第i行,总共放了j个,第i-1行的状态为s1,第i行的状态为s2的情况数。
3.复杂度为8*10*(1<<8)*(1<<8)*(1<<8),理论上是会超时的,但因为有很多剪枝,所以可以把时间复杂度降下去。
代码如下:
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #include <vector>
- #include <cmath>
- #include <queue>
- #include <stack>
- #include <map>
- #include <string>
- #include <set>
- using namespace std;
- typedef long long LL;
- const double EPS = 1e-;
- const int INF = 2e9;
- const LL LNF = 9e18;
- const int MOD = 1e5;
- const int MAXN = <<;
- int row[];
- int cnt[];
- int dp[][][MAXN][MAXN];
- int main()
- {
- int T, n;
- char str[];
- scanf("%d", &T);
- while(T--)
- {
- scanf("%d", &n);
- for(int i = ; i<=; i++)
- {
- scanf("%s", str);
- row[i] = ;
- for(int j = ; j<; j++)
- row[i] += (str[j]=='*')*(<<j);
- }
- for(int s = ; s<MAXN; s++)
- {
- cnt[s] = ;
- for(int j = ; j<; j++)
- if(s&(<<j))
- cnt[s]++;
- }
- memset(dp, , sizeof(dp));
- dp[][][][] = ;
- for(int i = ; i<=; i++)
- {
- for(int j = ; j<=n; j++)
- {
- for(int s1 = ; s1<MAXN; s1++)
- {
- if(i>&&(s1&row[i-])) continue;
- if(cnt[s1]>n) continue;
- for(int s2 = ; s2<MAXN; s2++)
- {
- if(i>&&(s2&row[i-])) continue;
- if( (s1&(s2<<)) || (s1&(s2>>)) ) continue;
- if(cnt[s2]>n) continue;
- for(int s3 = ; s3<MAXN; s3++)
- {
- if(s3&row[i]) continue;
- if( (s1&(s3<<)) || (s1&(s3>>)) ) continue;
- if( (s2&(s3<<)) || (s2&(s3>>)) ) continue;
- if(j-cnt[s3]<) continue;
- dp[i][j][s2][s3] += dp[i-][j-cnt[s3]][s1][s2];
- }
- }
- }
- }
- }
- LL ans = ;
- for(int s1 = ; s1<MAXN; s1++)
- for(int s2 = ; s2<MAXN; s2++)
- ans += dp[][n][s1][s2];
- printf("%lld\n", ans);
- }
- }
滚动数组:
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #include <vector>
- #include <cmath>
- #include <queue>
- #include <stack>
- #include <map>
- #include <string>
- #include <set>
- using namespace std;
- typedef long long LL;
- const double EPS = 1e-;
- const int INF = 2e9;
- const LL LNF = 9e18;
- const int MOD = 1e5;
- const int MAXN = <<;
- int row[];
- int cnt[];
- int dp[][][MAXN][MAXN];
- int main()
- {
- int T, n;
- char str[];
- scanf("%d", &T);
- while(T--)
- {
- scanf("%d", &n);
- for(int i = ; i<=; i++)
- {
- scanf("%s", str);
- row[i] = ;
- for(int j = ; j<; j++)
- row[i] += (str[j]=='*')*(<<j);
- }
- for(int s = ; s<MAXN; s++)
- {
- cnt[s] = ;
- for(int j = ; j<; j++)
- if(s&(<<j))
- cnt[s]++;
- }
- memset(dp[], , sizeof(dp[]));
- dp[][][][] = ;
- for(int i = ; i<=; i++)
- {
- memset(dp[i%], , sizeof(dp[i%]));
- for(int j = ; j<=n; j++)
- {
- for(int s1 = ; s1<MAXN; s1++)
- {
- if(i>&&(s1&row[i-])) continue;
- if(cnt[s1]>n) continue;
- for(int s2 = ; s2<MAXN; s2++)
- {
- if(i>&&(s2&row[i-])) continue;
- if( (s1&(s2<<)) || (s1&(s2>>)) ) continue;
- if(cnt[s2]>n) continue;
- for(int s3 = ; s3<MAXN; s3++)
- {
- if(s3&row[i]) continue;
- if( (s1&(s3<<)) || (s1&(s3>>)) ) continue;
- if( (s2&(s3<<)) || (s2&(s3>>)) ) continue;
- if(j-cnt[s3]<) continue;
- dp[i%][j][s2][s3] += dp[(i+)%][j-cnt[s3]][s1][s2];
- }
- }
- }
- }
- }
- LL ans = ;
- for(int s1 = ; s1<MAXN; s1++)
- for(int s2 = ; s2<MAXN; s2++)
- ans += dp[][n][s1][s2];
- printf("%lld\n", ans);
- }
- }
HDU4529 郑厂长系列故事——N骑士问题 —— 状压DP的更多相关文章
- HDU 4529 郑厂长系列故事——N骑士问题 状压dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4529 郑厂长系列故事--N骑士问题 Time Limit: 6000/3000 MS (Java/O ...
- 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
题目链接: 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
题意:给定一个合法的八皇后棋盘,现在给定1-10个骑士,问这些骑士不能够相互攻击的拜访方式有多少种. 分析:一开始想着搜索写,发现该题和八皇后不同,八皇后每一行只能够摆放一个棋子,因此搜索收敛的很快, ...
- hdu_4539_郑厂长系列故事——排兵布阵(状压DP|最大团)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4539 题意:中文,不解释 题解:将每一行的状态压缩,然后进行DP,也可以用最大团做.这里我用的DP # ...
- HDU----(4519)郑厂长系列故事——体检
郑厂长系列故事——体检 Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total S ...
- 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) ...
随机推荐
- k8s学习(一)——kubectl与api-server之间的交互核心过程
k8s的架构是用户使用kubectl工具对虚拟机资源进行各种各样的控制和定制. 而kubectl本身并不包含对其核心资源的访问与控制.而是通过http通信与api-server进行交互实现资源的管理. ...
- Esper epl语句实验
基础代码见下,下文列举的实验都是在此程序基础上改动. all,snapshot,first String epl = "select * from appTable.win:time(5 s ...
- js 输入框增加删除操作
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- linux挂载硬盘
最近有个生产机由于缓存问题,硬盘不太够用,所以就加载了一块硬盘,下面把挂载硬盘的过程记录下,供大家参考,有问题欢迎留言! fdisk –l ------------------------------ ...
- vue-cli配置文件详解
转自: https://blog.csdn.net/Mr_YanYan/article/details/79233188
- apue学习笔记(第十章 信号)
本章先对信号机制进行综述,并说明每种信号的一般用法. 信号概念 每个信号都有一个名字,这些名字都以3个字符SIG开头.在头文件<signal.h>中,信号名都被定义为正整形常量. 在某个信 ...
- mongodb:monogo和php整合
1.到如下网址,下载php扩展包,找一个最新stable版的.
- IIS配置asp.net网站
http://wenku.baidu.com/view/f8ce6c14767f5acfa0c7cd36.html
- vim 查找与替换
一.vim 查找 1. 正向查找 / 与 反向查找 ? 2. 退出查找 <Esc> 3. 跳转到下一处匹配 n ,跳转到上一处匹配 N 4. /<CR> 正向跳转到相同模式的下 ...
- redis安装报错
错误原因大概是这个: creating server tcp listening socket 127.0.0.1:6379: bind No error 解决方案如下按顺序输入如下命令就可以连接成功 ...