又是一道状压DP求方案数的题...

多了一个放k个的限制,于是我们把数组多开一维。

f[i][j][k]表示前i行放了j个,第i行状态为k的方案数。

然后老套路DFS转移,这次要多记录一个cnt表示上一行的棋子数。

然后因为什么都不放也是可以转移的,所以我们输出f[m + 1][k][0]即为最终答案。

中间有个num数组是指这个状态有多少个棋子。

  1. #include <cstdio>
  2.  
  3. typedef long long LL;
  4. const int N = ;
  5.  
  6. LL f[N + ][][ << N], ans;
  7. int pre, m, num[ << N], cnt, k;
  8.  
  9. inline int check(int s) {
  10. int a = ;
  11. while(s) {
  12. a += s & ;
  13. s >>= ;
  14. }
  15. return a;
  16. }
  17.  
  18. void DFS(int x, int y, int ns) {
  19. if(y >= m) {
  20. f[x][cnt + num[ns]][ns] += ans;
  21. return;
  22. }
  23. DFS(x, y + , ns);
  24. if(!y) {
  25. if(!((pre >> y) & ) && !((pre >> (y + )) & ) && cnt + num[ns] < k) {
  26. DFS(x, y + , ns | );
  27. }
  28. return;
  29. }
  30. if(!((ns >> (y - )) & ) && !((pre >> (y - )) & ) && !((pre >> y) & ) && !((pre >> (y + )) & ) && cnt + num[ns] < k) {
  31. DFS(x, y + , ns | ( << y));
  32. }
  33. return;
  34. }
  35.  
  36. int main() {
  37. scanf("%d%d", &m, &k);
  38. int lm = << m;
  39. for(int i = ; i < lm; i++) {
  40. num[i] = check(i);
  41. }
  42. f[][][] = ;
  43. for(int i = ; i <= m + ; i++) {
  44. for(int j = ; j < lm; j++) {
  45. for(int p = ; p <= k; p++) {
  46. if(!f[i - ][p][j]) {
  47. continue;
  48. }
  49. ans = f[i - ][p][j];
  50. pre = j;
  51. cnt = p;
  52. DFS(i, , );
  53. }
  54. }
  55. }
  56.  
  57. printf("%lld", f[m + ][k][]);
  58. return ;
  59. }

AC代码

洛谷P1896 互不侵犯的更多相关文章

  1. 洛谷 P1896 互不侵犯King

    P1896 [SCOI2005]互不侵犯King 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共 ...

  2. 状压DP概念 及例题(洛谷 P1896 互不侵犯)

    状压DP 就是状态压缩DP.所谓状态压缩,就是将一些复杂的状态压缩起来,一般来说是压缩为一个二进制数,用01来表示某一元素的状态. 比如一排灯泡(5个) 我们可以用一串二进制01串来表示他们的状态 1 ...

  3. 洛谷 P1896 [SCOI2005]互不侵犯

    洛谷 P1896 [SCOI2005]互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8 ...

  4. 【题解】洛谷P1896 [SCOI2005] 互不侵犯(状压DP)

    洛谷P1896:https://www.luogu.org/problemnew/show/P1896 前言 这是一道状压DP的经典题 原来已经做过了 但是快要NOIP 复习一波 关于一些位运算的知识 ...

  5. 洛谷P1896||bzoj1087 [SCOI2005]互不侵犯

    bzoj1087 洛谷P1896 想了很久,太久没做状压都已经不会了... 状压每一行就好了 #include<cstdio> #include<algorithm> #inc ...

  6. 状压DP【洛谷P1896】 [SCOI2005]互不侵犯

    P1896 [SCOI2005]互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子 ...

  7. 洛谷P1896 [SCOI2005]互不侵犯King

    P1896 [SCOI2005]互不侵犯King 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共 ...

  8. 洛谷——P1896 [SCOI2005]互不侵犯

    P1896 [SCOI2005]互不侵犯 状压DP入门题 状压DP一般需要与处理状态是否合法,节省时间 设定状态dp[i][j][k]表示第i行第j个状态选择国王数为k的方案数 $dp[i][j][n ...

  9. BZOJ1087=Codevs2451=洛谷P1896&P2326互不侵犯

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2885  Solved: 1693[Submit][ ...

随机推荐

  1. day 7 -1 进程理论知识

    一.进程的定义 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实 ...

  2. Appscanner实验还原code2

    import _pickle as pickle from sklearn import svm, ensemble import random from sklearn.metrics import ...

  3. countByValue

    [1,2,3,3]的RDD rdd.foreach(println)---------------------1 2 3 3

  4. django restframework PrimaryKeyRelatedField筛选的困惑

    一.在开发某运动app时,遇见以下情况 1.部分表内容如下: class Sports(models.Model): ''' 运动表 ''' school = models.ForeignKey(Sc ...

  5. mysql高可用架构之MHA,haproxy实现读写分离详解

    MySQL高可用架构之MHA 一.运维人员需要掌握的MySQL技术: 1.基本SQL语句 2.基本的管理[库表数据的管理    权限的管理] 3.容灾       保证数据不丢失. 二.工作中MySQ ...

  6. list类型功能剖析

    append  向后追加 name_list=["eirc","alex","tony"] name_list.append('seven' ...

  7. python数据结构与算法第四天【代码执行时间测试模块】

    #!/usr/bin/env python # _*_ coding:UTF-8 _*_ from timeit import Timer def foo(): ''' 使用append方式向列表添加 ...

  8. Oracle 查询两个时间段内的所有日期列表

    1.查询某时间段内日期列表 select level,to_char(to_date('2013-12-31','yyyy-mm-dd')+level-1,'yyyy-mm-dd') as date_ ...

  9. Play framework框架中通过post方式发送请求

    搞了好久这个最终还是在play官方文档中看见的发送请求的方式,国内好像很少有使用这个框架的,加之自己不是太愿意宣传,好东西总归是好东西,不说废话了. 在play中发送请求有两种常用的方式,一种get, ...

  10. JAVA web 使用有盟推送总结

    仔细阅读文档,下边的都是废话. 为了省事,iOS和Android 提供了所有了参数,需要那个了修改传参. //ios actionURL为自定义参数 $.ajax({ type : "POS ...