N骑士问题 HDU4529

本文介绍了郑厂长在解决八皇后问题后,对在棋盘上摆放骑士的问题产生兴趣。他希望摆放的骑士彼此不相互攻击。问题转化为计算满足条件的摆放方式数量。通过状态压缩的动态规划方法来解决,描述了dp数组的四个状态含义以及转移方程,并提到未经优化的暴力解法效率低下,但经过优化后可以解决问题。
摘要由CSDN通过智能技术生成

最近,郑厂长对八皇后问题很感兴趣,拿着国际象棋研究了好几天,终于研究透了。兴奋之余,坐在棋盘前的他又开始无聊了。无意间,他看见眼前的棋盘上只摆了八个皇后,感觉空荡荡的,恰好又发现身边还有几个骑士,于是,他想把这些骑士也摆到棋盘上去,当然棋盘上的一个位置只能放一个棋子。因为受八皇后问题的影响,他希望自己把这些骑士摆上去之后,也要满足每2个骑士之间不能相互攻击。
  现在郑厂长想知道共有多少种摆法,你能帮助他吗?

骑士的下法:
  每步棋先横走或直走一格,然后再往外斜走一格;或者先斜走一格,最后再往外横走或竖走一格(即走“日”字)。可以越子,没有”中国象棋”的”蹩马腿”限制。

一道简单的状态压缩dp,和皇后并没有什么关系,只是摆了皇后的地方不能摆骑士。

dp[i][num][j][k] 记录四个状态:
i 代表第 i 行
num 代表前i-1行里共有num个骑士
j 代表 i-1行的状态
k 代表 i 行的状态

转移方程 dp[i][cnt+num][k][l] += dp[i-1][num][j][k];
cnt 为当前行的骑士个数 l 代表第 i 行 ,k 代表 i - 1行,j代表 i - 2 行
直接暴力写肯定会跪,刚写出来本地运行一个用例要2秒多,加上一些简单的优化就搞定了。

#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

int N;
int G[10];
int dp[10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值