luogu1896 [SCOI2005]互不侵犯 状压DP】的更多相关文章

题目大意 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子.( 1 <=N <=9, 0 <= K <= N * N) 题解 这跟"炮兵阵地"很是相似.定义一行的状态\(S\)为是否安放国王的01集合.先预处理出一行中两两国王无法攻击的所有状态(以后简称合理状态),以及这些状态中1的个数\(g(S)\).定义\(f(r,S,k)\)为当第\(r\)行的状态为\(S…
题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 输入 只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K <= N * N) 输出 方案数. 样例输入 3 2 样例输出 16     n<=9,显然是状压dp,定义状态f[i][j][k]表示枚举到第i行,状态为j,前i行总共放了k个国王的方案数.搜索出一行符合的所有状态,枚举当前行和上一行的状态,…
正解:状压dp 解题报告: 看到是四川省选的时候我心里慌得一批TT然后看到难度之后放下心来觉得大概没有那么难 事实证明我还是too young too simple了QAQ难到爆炸TT我本来还想刚一道紫题搞完这个之后就佛了不做了TT 不扯淡了太太太浪费时间辣 好那直接港 首先我想到的就觉得大概是和那个奶牛玉米田的没有太大区别改一改就能ac! 然后我就先照着玉米田做完,发现过不了样例 于是改,改了半小时,好像差不多了,因为要存储放了几个国王巴拉巴拉的 还是没过样例,输出下过程,发现是上一种状态有很…
题目传送门 题目大意:有n*n个格子,你需要放置k个国王使得它们无法互相攻击,每个国王的攻击范围为上下左走,左上右上左下右下,共8个格子,求最多的方法数 看到题目,是不是一下子就想到了玉米田那道题,如果不会的话可以去我另外一篇博客里面看看,里面有玉米田详细解答方案. 好,回到这道题.首先,看到数据范围,很自然的想到状压dp.题目要求我们已经放了国王格子的上下左右以及左上右上左下右下都不能放国王,那么我们就可以通过上一行的状态来更新这一行的状态,即dp[i][state]表示到第i行状态为stat…
题目链接 Solution 状压 \(dp\) . \(f[i][j][k]\) 代表前 \(i\) 列中 , 已经安置 \(j\) 位国王,且最后一位状态为 \(k\) . 然后就可以很轻松的转移了... 记忆化搜索还是不够啊... 只能会正向 \(dp\) . Code #include<bits/stdc++.h> #define ll long long using namespace std; ll f[10][101][1100],n,K; ll js[1100],sum,ans;…
题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 注:数据有加强(2018/4/25) 输入输出格式 输入格式: 只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K <= N * N) 输出格式: 所得的方案数 输入输出样例 输入样例#1: 复制 3 2 输出样例#1: 复制 16 思路: 这题一看n<=9,二话不说就上状压DP. f[i][j][k…
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1087 令f(i, j, k)表示前i列,二进制状态为j,已经用了k个国王的方案数,则 f(i, j, k) = sigma(i - 1, p, k - num[j]),其中可以从p状态转化到j状态,num[j]表示j状态下的国王数. 乍一看可能会超时,因为共有n * 2^n * n^2个状态,即状态数为O(n^3 * 2^n),转移的复杂度为O(2^n),因此总时间复杂度为O(n^3 *…
P1896 [SCOI2005]互不侵犯 状压DP入门题 状压DP一般需要与处理状态是否合法,节省时间 设定状态dp[i][j][k]表示第i行第j个状态选择国王数为k的方案数 $dp[i][j][num[j]+p]+=dp[i-1][k][p]$ 转移方程如上,表示第i行第j个状态国王数量为$num[j]+p$由上一行第k个状态的p个国王转移而来 状压DP的一般套路不就是将数的二进制表示成状态,如1010(10)10这个数就表示第一个位置放,第二个不放,以此类推 预处理:判断这一行的国王是否冲…
状压DP 就是状态压缩DP.所谓状态压缩,就是将一些复杂的状态压缩起来,一般来说是压缩为一个二进制数,用01来表示某一元素的状态. 比如一排灯泡(5个) 我们可以用一串二进制01串来表示他们的状态 11111就是全开 00000就是全关 00001就是只开了第五个 00101就是第三和第五个开了 以此类推.....而这个二进制串是可以用一个十进制数表示的 比如31就是11111 ,1就是00001等等,这样我们在遍历的时候就不用将五个灯泡疯狂循环,只需要从0遍历到31即可 大大节省了时空. 这里…
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][Status][Discuss] Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K &…
[SCOI2005]互不侵犯King [题目描述] 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. [输入] 只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K <= N * N) [输出] 方案数. [样例输入] 3 2 [样例输出] 16 分析: 经典的状压DP题目,可我竟然调了很长时间都没对,后来发现是DP枚举范围错了,直接枚举到最大情况导致答案大得离谱,所…
Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上 左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K <= N * N) Output 方案数. Sample Input 3 2 Sample Output 16   简单的题目描述,往往蕴藏着巧妙的算法--X   这道题的数据范围十分清新,暗喻着这道题可以承受较高的复杂度. 由…
经典状压DP. f[i][j][k]=sum(f[i-1][j-cnt[k]][k]); cnt[i]放置情况为i时的国王数量 前I行放置情况为k时国王数量为J #include <iostream> #include <cstdio> using namespace std; #define N 1<<9 long long ans; int n,m; int ok_1[N],cnt[N]; int ok_2[N][N]; ][*+][N]; void init()…
http://www.lydsy.com:808/JudgeOnline/problem.php?id=1087 状压dp是第一次写啊,我也是才学TAT.状压dp一般都用一个值表示集合作为dp的一个状态,然后根据集合和dp的性质转移.通常用于啥啥啥..... 我引用些吧 我们知道,用DP解决一个问题的时候很重要的一环就是状态的表示,一般来说,一个数组即可保存状态.但是有这样的一些题目,它们具有DP问题的特性,但是 状态中所包含的信息过多,如果要用数组来保存状态的话需要四维以上的数组.于是,我们就…
Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K <= N * N) Output 方案数. Sample Input 3 2 Sample Output 16 HINT Source Solution 状压$dp$就是把状态压缩成二进制数,利用二进制的位运算改进算法的一种方法…
Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上 左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K <= N * N) Output 方案数. Sample Input 3 2 Sample Output 16   状压DP入门题 f[i][j][k]表示放完i行,第i行状态为j,i行放了k个   #include<io…
嗝~算是状压DP的经典题了~ #\(\mathcal{\color{red}{Description}}\) 在\(N×N\)的棋盘里面放\(K\)个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共\(8\)个格子. #\(\mathcal{\color{red}{Solution}}\) 嗯,然后今天(其实是前天)接触了一种新颖的\(DP\)--状压\(DP\).其实就是一种借用二进制表示状态的方式,类似于"压缩"了…
BZOJ1087 SCOI2005 互不侵犯King Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K <= N * N) Output 方案数. Sample Input 3 2 Sample Output 16 我们先预处理出哪些状态是合法的,即一个二进制状态没有连续的1,然…
在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 好像若干月前非常Naive地去写过DFS... 然后其实作为状压DP是一道非常好的题啦>< 感觉直接无脑搞时间是下不来的 做了好几道预处理 使得最后DP的过程中没有任何一条转移是无用的 program bzoj1087; var i,x,n,k,j,p,q,t1,t2:longint; ans:int64; a:array[-..]of lon…
题目链接 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 这是道状压\(DP\)好题啊.. 定义状态:一个二进制数某一位为\(1\)表示该位放了国王,反之亦然. 设\(f[i][j][k]\)表示,前\(i\)行,已经放了\(j\)个国王,并且第\(i\)的状态为\(k\)时的方案数. 直接枚举所有状态显然不可行,于是可以先预处理去所有相邻两格不矛盾的状态,也就是每一行可能出现的状态.…
Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K <= N * N) Output 所得的方案数 很明显\(N \leq 9\)状压DP啊 qwq. 这里有限制,我们只能放\(K\)个国王,并且如果一个格子有国王,其周围八个格子都不能放. 设状态\(f[i][j][k]\)代表前…
点此看题面 大致题意: 在\(N×N\)的棋盘里面放\(K\)个国王,使他们互不攻击,共有多少种摆放方案(国王能攻击到它周围的8个格子). 状压\(DP\) 一看到这道题我就想到了经典的八皇后问题,但是,这道题其实可以用状压\(DP\)来做. 我们可以发现,影响该行国王摆放方法的只有上一行国王的摆放方式,因此,对于第\(i\)行,我们只需要知道第\(i-1\)行的国王的摆放方式即可.所以,我们可以用\(f[i][j]\)来记录第\(i\)行,国王摆放方式为\(j\)的方案数即可(这里将摆放方式状…
题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子.n<=9 思路:状压dp,dp[i][j][k]为前i行放了j个,第i行状态为k 代码: #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include&…
洛谷P1896:https://www.luogu.org/problemnew/show/P1896 前言 这是一道状压DP的经典题 原来已经做过了 但是快要NOIP 复习一波 关于一些位运算的知识点参考: https://blog.csdn.net/fox64194167/article/details/20692645 思路 看数据识算法系列 我们用f[i][j][k]来表示第i行为状态j 并且前i行已经放了k个国王 对于状态我们可以先预处理出来 因为每个格子有放和不放两种选择 那么我们可…
P1896 [SCOI2005]互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 注:数据有加强(2018/4/25) 输入输出格式 输入格式: 只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K <= N * N) 输出格式: 所得的方案数 \(continue\)和\(break\)傻傻分不清,也是挺厉害了... code: #include…
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4595  Solved: 2664[Submit][Status][Discuss] Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K &…
传送门 先预处理出来一行中放置国王的所有情况和每种情况所用的国王个数. f[i][j][k]表示前i行放j个国王且最后一行的状态为k的方案数 状压DP即可 #include <cstdio> #define N 1001 int n, m, cnt, ans; int a[N][2], f[10][82][N]; inline void dfs(int s, int k, int last) { if(k > m) return; int i, j; cnt++; a[cnt][0] =…
前言:一道状压DP的入门题(可惜我是个DP蒟蒻QAQ) ------------------ 题意简述:求在一个$n*n$的棋盘中放$k$个国王的方案数.注:当在一个格子中放入国王后,以此格为中心的九宫格的其他八个格子将不能放置国王. 数据范围:$1\leq n\leq 9$,$1\leq k\leq n*n$. ------------------------------ 看到数据范围,不是$dfs$就是状压DP.这道题我们考虑状压DP. 状压DP就是把某个阶段转换成二进制记录下来,一般用于数…
一.题目 Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上.下.左.右,以及左上.左下.右上.右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K <= N * N) Output 方案数 Sample Input 3 2 Sample Output 16 原题链接→_→bzoj1087: [SCOI2005]互不侵犯King 二.题目分析 其实我们可以…
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2337 Solved: 1366 [Submit][Status][Discuss] Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K &…