1896 互不侵犯 洛谷 luogu
题目描述
在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子。
注:数据有加强(2018/4/25)
输入输出格式
输入格式:
只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K <= N * N
输出格式:
所得的方案数
------------------------------------------------------------------------------
懵
#include<iostream>
#include<cstdio>
using namespace std;
int n,k;
long long dp[][][]; //dp[i][j][k]表示第i行,状态为j,前面摆了k个国王时,方案数;
long long state[] , king[] ;//state[]是当前状态,king[]是当前行的国王数;
long long ans , sum;//ans是用来记录状态总数的,sum是用来计算一共有多少种方案的; inline void inte()
{
int tot = (<<n) - ;//最多到这个时候,就是二进制下,每一位上都放上国王,当然有不行的,为了方便下文排除;
for(int i = ; i <= tot ; i++)
if(!((i<<)&i)) //因为要互不侵犯,所以,两个国王之间必须隔一个,这是判断是否满足题意国王之间不相互攻击;
{
state[++ans] = i; //找到了满足的,记录这个状态;
int t = i;
while(t) //判断这个状态有多少个国王,也就是t在二进制下有多少个1;
{
king[ans] += t%;
t>>=; //记住,是右移一位,和 t/=2 一样,就是稍微快一点;
}
}
} int main()
{
cin>>n>>k; //数据;
inte(); //初始化;
for(int i = ; i <= ans ; i++) //先处理第一行;
if(king[i] <= k) //一行的国王数一定不能超过总数;
dp[][i][king[i]] = ; for(int i = ; i <= n ; i++) //处理剩下的,所以从 2 开始枚举;
for(int j = ; j <= ans ; j++) //枚举状态;
for(int p = ; p <= ans ; p++) //再一遍状态,用来当作上一行的状态,因为 我们由上向下递推,能迎上本行的,只有上一行;
{
//这里就不在赘述了,和处理第一行同理,但是不同的是这里处理相邻的行,
if(state[j] & state[p]) continue; //所以,上下相邻不行
if(state[j] & (state[p]<<)) continue; //本行的右上角不能有国王;
if((state[j]<<) & state[p]) continue; //左上角也不行;
for(int s = ; s <= k ; s++)
{
//s表示本行以上用了多少国王; //满足条件后,还要记得国王数量是有限的!!
if(king[j] + s > k) continue; //我们是递推,所以本行以上一定处理完了,所以,本行加以前用过的国王,总数不能超过限定;
dp[i][j][king[j]+s] += dp[i-][p][s]; //还记得dp[i][j][k]中的k表示已经用过的国王数,而king[]是本行的,s是本行以前的;
}
} for(int i = ; i <= n ; i++) //因为不确定在哪一行用光国王,所以都枚举一遍;
for(int j = ; j <= ans ; j++)
sum += dp[i][j][k]; //本行及以前用光了国王,那么方案数加在总数中; cout<<sum;
return ; }
1896 互不侵犯 洛谷 luogu的更多相关文章
- P1654 OSU!-洛谷luogu
传送门 题目背景 原 <产品排序> 参见P2577 题目描述 osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: 一共有n次操作,每次操作只有成功与失败 ...
- 【原创】洛谷 LUOGU P3366 【模板】最小生成树
P3366 [模板]最小生成树 题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入输出格式 输入格式: 第一行包含两个整数N.M,表示该图共有N个结点和M条无向边.(N ...
- 【原创】洛谷 LUOGU P3371 【模板】单源最短路径
P3371 [模板]单源最短路径 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出 ...
- 【原创】洛谷 LUOGU P3373 【模板】线段树2
P3373 [模板]线段树 2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格式: 第 ...
- 【原创】洛谷 LUOGU P3372 【模板】线段树1
P3372 [模板]线段树 1 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别 ...
- P1440 求m区间内的最小值--洛谷luogu
题目描述 一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值.若前面的数不足m项则从第1个数开始,若前面没有数则输出0. 输入输出格式 输入格式: 第一行两个 ...
- P2251 质量检测--洛谷luogu
传送门 题目描述 为了检测生产流水线上总共N件产品的质量,我们首先给每一件产品打一个分数A表示其品质,然后统计前M件产品中质量最差的产品的分值Q[m] = min{A1, A2, ... Am},以及 ...
- P4550 收集邮票-洛谷luogu
传送门 题目描述 有n种不同的邮票,皮皮想收集所有种类的邮票.唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是n种邮票中的哪一种是等概率的,概率均为1/n.但是由于凡凡也很喜欢 ...
- P3200 [HNOI2009]有趣的数列--洛谷luogu
---恢复内容开始--- 题目描述 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满足a1<a3& ...
随机推荐
- [PHP] 算法-构建排除当前元素的乘积数组的PHP实现
构建乘积数组给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]. ...
- Jquery Ajax 调用后台并返回数据
一.前台调用ajax并解析json对象. $.ajax({ url : '', type : 'POST', //GET data : '’, beforeSend : function(reques ...
- Maven+Mybatis一些简单例子
一.创建maven工程 把依赖的包写在pom.xml中.保存后,工程会有错,需要在工程上右键选择“Maven-->Update Project” pom.xml内容为 <project x ...
- Android ContentProvider数据共享
一.构造一个自己的Provider实现App之间数据共享 1.我们先来了解一下 Uri(统一资源定位符) 定义:每一个Content Provider使用一个公开的URI唯一标示其数据集,Andr ...
- 初学CSS-3-文字的属性
文字样式属性: 格式:font-style:italic;/normal; 快捷键:fsi / fsn + tab键 文字粗细属性: 格式:font-weight:bold;/bolder;/ligh ...
- 初学HTML-10
marquee标签:设置文字滚动效果. 格式:<marquee>文字滚动</marquee> 属性:direction:设置滚动方向:left / right / up / d ...
- JS如何判断一个对象是否为空、是否有某个属性
一.js判断一个对象是否为空 方法一: let obj1 = {} let obj2 = {a:1} function empty(obj){ for (let key in obj){ return ...
- CSS图片两端对齐,自适应列表布局末行对齐修复实例页面
写在前面 前端开发,图片两端对齐,是十分常见的,也是十分痛苦的,我试过好多方法,通过整理,认为下面还是比较靠谱的,在实践中大家可以试试,欢迎一起学习,一起进步 HTML代码 HTML代码非常简单,用的 ...
- python之正则表达式及RE模块
正则表达式(匹配字符串)web界面正则匹配工具:http://tool.chinaz.com/regex/ 元字符 1 . 匹配除换行符之外的任意字符 2 \w 匹配数字字母下划线 3 \d 匹配数字 ...
- Flutter 不一样的跨平台解决方案
本文主要介绍Flutter相关的东西,包括Fuchsia.Dart.Flutter特性.安装以及整体架构等内容. 1. 简介 Flutter作为谷歌最近推出的跨平台开发框架,一经推出便吸引了不少注意. ...