洛谷1377 M国王 (SCOI2005互不侵犯King)
洛谷1377 M国王 (SCOI2005互不侵犯King)
本题地址:http://www.luogu.org/problem/show?pid=1377
题目描述
天天都是n皇后,多么无聊啊。我们来一道m国王游戏吧!
题目是这样的,在n*n的格子里放m个国王,使他们不互相攻击,有多少种放法呢?(可以为0)
国王的攻击力大不如皇后,他只能对与他相邻的8个格子产生攻击。
输入输出格式
输入格式:
n,m
输出格式:
方案数
输入输出样例
输入样例#1:
1 1
输出样例#1:
1
说明
数据范围:
100%的数据满足n<=8,m<=n*n
时限2秒(保证正常代码可以在时限内通过)
【思路】
状态压缩DP。
注意这个题与n皇后的差别:可以有多个国王放在同一行。
设d[i][s1][j]表示放到第i行 第i行放置状态为s1 且已经放了j个 的方案数。s用二进制表示。则有转移方程如下:
d[i][s1][j]
+= d[i-1][s2][j-cnt[s1]]
其中cnt表示状态中放置的国王数。
优化:注意到不是每一个状态都是有用的,也不是任两个状态可以互相转移。因此可以提前筛去自身不符合要求的状态(can),同时建立状态之间的边(has_edge)。
【代码】
#include<iostream>
#include<cstring>
using namespace std; const int maxn = <<; typedef long long LL;
LL d[][maxn][*];
int cnt[maxn];
bool has_edge[maxn][maxn];
bool can[maxn];
int n,m,all; void get_edge() {
for(int i=;i<all;i++) if((i&i>>)==)
{
can[i]=true;
for(int j=;j<n;j++) if(i&(<<j)) cnt[i]++;
for(int j=;j<all;j++)
if(((i&j)==) && ((i>>)&j)== && ((j>>)&i)==)
has_edge[i][j]=true;
}
} int main() {
cin>>n>>m;
all=<<n; get_edge();
for(int s=;s<all;s++) if(can[s]) d[][s][cnt[s]]=; for(int i=;i<=n;i++)
for(int s1=;s1<all;s1++) if(can[s1])
for(int j=cnt[s1];j<=m;j++)
{
for(int s2=;s2<all;s2++) if(can[s2] && has_edge[s1][s2])
d[i][s1][j] += d[i-][s2][j-cnt[s1]];
}
LL ans=;
for(int s=;s<all;s++) ans += d[n][s][m];
cout<<ans;
return ;
}
另外一定要注意二进制的运算优先级,不确定的时候就加括号。
洛谷1377 M国王 (SCOI2005互不侵犯King)的更多相关文章
- 洛谷P1896 [SCOI2005]互不侵犯King
P1896 [SCOI2005]互不侵犯King 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共 ...
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- SCOI2005互不侵犯King
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1499 Solved: 872[Submit][S ...
- 1087: [SCOI2005]互不侵犯King
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4276 Solved: 2471[Submit][ ...
- BZOJ1087 SCOI2005 互不侵犯King 【状压DP】
BZOJ1087 SCOI2005 互不侵犯King Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附 ...
- bzoj 1087 [SCOI2005]互不侵犯King 状态压缩dp
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MB[Submit][Status][Discuss] Descripti ...
- BZOJ 1087:[SCOI2005]互不侵犯King(状压DP)
[SCOI2005]互不侵犯King [题目描述] 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子 ...
- [Bzoj1083][SCOI2005]互不侵犯king(状压dp)
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4595 Solved: 2664[Submit][ ...
- [SCOI2005]互不侵犯King
题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. ——by洛谷 https://www. ...
随机推荐
- python3实现的web端json通信协议
之前有用python3实现过tcp协议的,后来又实现了http协议的通信,今天公司想做一个功能自动测试系统, 下午弄了一会,发现json格式的实现可以更简单一点,代码如下:简单解说一下,一般与服务器通 ...
- windows平台 culture name 详细列表
点击打开链接http://msdn.microsoft.com/zh-cn/goglobal/bb896001.aspx LCID Culture Identifier Culture Name Lo ...
- (四)跟我一起玩Linux网络服务:DHCP服务配置之中继代理
继第三部分的DHCP服务器的设置成功,我们来做一个中继代理服务器的配置吧. 我们的虚拟机结构如图: 具体参考: (一)跟我一起玩Linux网络服务:DNS服务——BIND(/etc/named.con ...
- php会话控制cookie/session
设置cookie PHP设置Cookie最常用的方法就是使用setcookie函数,setcookie具有7个可选参数,我们常用到的为前5个: name( Cookie名)可以通过$_COOKIE[' ...
- hdu 1009 贪心算法
博主英语不好,看懂个大概,老鼠有M磅猫食.有N个房间,每个房间前有一只猫,房间里有老鼠最喜欢的食品JavaBean,J[i].若要引开猫,必须付出相应的猫食F[i]. 当然这只老鼠没必要每次都付出所有 ...
- vs15
vs15 preview5 离线安装包 vs15 preview5 离线安装包 1.介绍 vs15是微软打造的新一代IDE,全新的安装方式.官网介绍如下(https://blogs.msdn.mi ...
- Length of Last Word | Leetcode
Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return the l ...
- 我的pch文件
/** * 1. RGB背景色 */ #define PPCOLOR_RGB(r,g,b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue: ...
- 五子棋-b
五子棋是程序猿比较熟悉的一款小游戏,相信很多人大学时期就用多种语言写过五子棋小游戏.笔者工作闲暇之余,试着用OC实现了一下,在这里给大家分享一下.有不足之处,欢迎大家提供建议和指点!!!GitHub源 ...
- 模拟键盘输入 : SendMessage, keybd_event, PostKeybdMessage
转自模拟键盘输入 : SendMessage, keybd_event, PostKeybdMessage 目的 最近项目要求在Windows CE下模拟键盘输入,上网搜索了一下,发现有3个API可以 ...