传送门1
传送门2
写在前面:第一次写状压DP,感觉还好,至少比数论好些,还有就是让我膜一发位运算……
思路:一看数据范围n<=9而且是省选,就知道这个题九成是状态压缩,题目限制条件与上一行的摆放情况有关,所以这里通过把上一行的国王摆放状态转化为2进制,为0~511,通过511*511的预处理把各二进制数之间的关系求出来,这里是对行与行之间的判断,还要把每一行之中的情况进行预处理,然后就差不多可以DP转移了
f[i][j][p]=sigma(f[i-1][j-num(p)][q]) (num(p)为p的二进制中1的个数,我的代码中是直接打了表的)i为行数,j为已经摆放的国王,p为当前第i行的摆放情况,这里要求p,q均合法且p,q之间不存在攻击状况.
注意:
1.带有位运算的语句括号很重要!真的很重要!
2.多用位运算处理状压DP中的抵触情况,很方便的
代码:

#include"bits/stdc++.h"
#define LL long long
using namespace std;
int n,k,num[513]={0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9};
bool flag2[512][512],flag1[513];//分别判断行与行之间的关系与每一行之中的关系
LL f[10][90][520],ans;
bool pd(int i,int j)
{if(((i&j)==0)&&((i&(j>>1))==0)&&((j&(i>>1))==0)) return 1;//挺神的位运算判断两摆放情况是否抵触,刚开始我是把每个数拆出来了Orzelse return 0;
}
main()
{scanf("%d%d",&n,&k);for (int i=0;i<=(1<<n)-1;i++) if ((i&(i>>1))==0) flag1[i]=1;//同样神奇的位运算for (int i=0;i<=(1<<n)-1;i++)if (flag1[i])for (int j=0;j<=(1<<n)-1;j++)if (flag1[j])flag2[i][j]=pd(i,j);f[0][0][0]=1;for (int i=1;i<=n;i++)for (int j=0;j<=min(k,n*i);j++)for (int p=0;p<=(1<<n)-1;p++)if (flag1[p]&&j-num[p]>=0)for (int q=0;q<=(1<<n)-1;q++)if (flag1[q]&&flag2[p][q])f[i][j][p]+=f[i-1][j-num[p]][q];for (int i=0;i<=(1<<n)-1;i++)ans+=f[n][k][i];printf("%lld",ans);
}

【BZOJ1087】【codevs2451】互不侵犯,状压DP相关推荐

  1. 洛谷P1896 [SCOI2005]互不侵犯 状压dp+位运算

    题目链接:https://www.luogu.org/problem/P1896 题意:n*n的格子填数,每个数填放位置的周围(8个)不能有其他的数 n<=9 ,矩形状压 f[i][j][s], ...

  2. 洛谷P1896 互不侵犯【状压DP】

    题目链接:P1896 互不侵犯 分析:普通的状压DP再多加一维记个数,然后找到能转移到当前的状态更新答案: #include<bits/stdc++.h> using namespace ...

  3. 刷题周记(九)——#状压DP:最短Hamilton路径、小国王(互不侵犯)、玉米田(Corn Fields G)、愤怒的小鸟、吃奶酪、炮兵阵地、宝藏 #区间DP:清空字符串#DP:关灯问题II

    文章目录 --2020年12月20日(周日)------------------ 状压DP 一.最短Hamilton路径(模板题) 二.玉米田(P1879 [USACO06NOV]Corn Field ...

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

    题目链接 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 这是道状压\(DP\)好题啊.. ...

  5. BZOJ 1087 SCOI2005 互不侵犯King 状压DP

    题目大意:给定n*n的国际象棋棋盘.在上面放k个国王,要求国王之间互不攻击.求方案数 n<=⑨ 状压DP.将每一行的方案二进制压成一维,令f[i][j][k]为第i行用去j个国王状态为k的方案数 ...

  6. 【Luogu】P1896互不侵犯King(状压DP)

    题目链接 真是可恶,被数据范围坑了一把.想要一遍AC的希望破灭了-- 以后大家在做状压DP的时候一定要开long long-- 设f[i][j][k]表示考虑前i行,总共放了j个King,第i行状态为 ...

  7. 状压dp之二之三 炮兵阵地/玉米田 By cellur925

    一.简单的状压dp 玉米田 题目描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ ...

  8. 【算法竞赛学习笔记】状压DP

    title : 状压DP date : 2022-3-5 tags : ACM,图论,动态规划 author : Linno 状压DP 状态压缩,是利用二进制数的性质对问题进行优化的一种算法,经常与搜 ...

  9. 状压dp个人刷题记录

    目录 一.普通型 蒙德里安的梦想 题意: 思路: code: #2153. 「SCOI2005」互不侵犯 题意: 思路: code: P1879 [USACO06NOV]Corn Fields G 题 ...

最新文章

  1. HDU 2206 IP的计算(字符串处理)
  2. 推荐一款学习R的APP
  3. 触摸事件练习 -- 手势解锁
  4. Android Binder 分析——原理
  5. 【白话机器学习】算法理论+实战之PCA降维
  6. myeclipse无法启动tomcat的一种情况
  7. 把 14 亿中国人民都拉到一个微信群里在技术上能实现吗?
  8. 剑指Offer - 面试题3. 数组中重复的数字(哈希)
  9. Java 已老,Kotlin 或将取而代之!
  10. 阿里发布藏经阁计划:一年建成知识引擎服务平台
  11. [转载] python 运算符重载有什么用_Python运算符重载用法实例分析
  12. 为什么在12306买火车票要装根证书?
  13. hilbert希尔伯特变换
  14. Centos下docker相关文件迁移发生的问题记录
  15. Alignment--本地blast使用详解1-数据库序列检索下载及比对
  16. LeetCode 299猜数字游戏
  17. 罗永浩刚直播完,就被罚款拘留?老罗是这么回应的...
  18. 邮箱输入注册测试用例
  19. Deep Learning(深度学习)学习笔记整理
  20. 通达信资金净流入公式_通达信主力资金净流入公式是什么?

热门文章

  1. 补习系列(10)-springboot 之配置读取
  2. 带着canvas去流浪系列之五 绘制K线图
  3. 华为鸿蒙怎么体验,华为鸿蒙 HarmonyOS 2.0 发布,教你如何升级体验
  4. x内存满白苹果解决_原来苹果手机这样清理内存,可以释放大量空间,真是太好用了...
  5. Kotlin学习笔记17 反射Part1
  6. List的isEmpty与==null的区别
  7. CSNN: An Augmented Spiking based Framework with Perceptron-Inception
  8. pycharm新项目加载库的方法
  9. html5 a-z字母排序,vue.js或js实现中文A-Z排序的方法
  10. php集成是什么原因,PHP集成开发环境里面的www问题