状压dp

目前还不理解,为什么本来才6行,变成1<<6=64了却是状态压缩呢?
为什么是a&(c<<2)呢,这个&好像低位全一样即可,不是完全相同也可以啊?




乍一看以为这个题是DFS,但是是一个深藏不露的dp
还是之前没做过的状态压缩dp
看了一下午。

DP求解步骤

1.找子问题
2.状态转移方程 最难
3.初始条件和边界条件 最容易忽略
4.计算顺序

解析传送门

状态压缩dp 二进制枚举小的6,循环枚举大的110
所以这里for循环枚举列,二进制枚举行
f[i][a][b][j] 表示已经放好了前i列,第i列状为b,第i-1列状态为a,一共放了j个马
dp的步骤
1.找子问题
2.状态转移方程
3.初始条件和边界条件
4.计算顺序


f[i-1][b][c][j-count[b]] -> f[i][a][b][j]
状态是什么?状态是一个二进制数,为1代表这个位上有马,反之则无马
a b c分别是i i-1 i-2列的状态,即1的个数
j是放的马的个数


初始条件,f[0][0][0][0] = 1 不能忽视!!!!


为什么是先枚举i-1列,在枚举i列,再枚举i-2列呢
这个好像没有关系试过了
只需要先判断当前列和前一列不能有冲突
再看当前列和上上列不能有冲突即可


a b c状态代表什么?
代表一个二进制数,为1代表有马,0代表无马
光一个就要枚举2^6=64种情况。可怕


为什么a b c要从0开始,取不到2^n呢?
a b c代表一个数,为1代表有马,0代表无马
最大表示到n位全为1,即最大是2^n -1。取不到2^n


为什么都是左移?
右移也可以。


如何理解状态转移方程f[i][a][b][j] = (f[i][a][b][j] + f[i-1][c][a][j-t])%mod,其中t=b里二进制1的个数


总结知识点

1.状态压缩dp 四维!
2.求一个数二进制中1的个数
3.


#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 110,M=1<<6,K=21,mod=1e9+7;
int f[N][M][M][K];
int n,m,k;
int get(int x)
{//求二进制中1的个数int res=0;while(x){res++; x-=x&-x;//x&-x取最低位的1}return res;
}
int main()
{cin>>n>>m>>k;//初始状态f[0][0][0][0] = 1;for(int i=1;i<=m;i++) //循环枚举列for(int a=0; a< 1 << n;a++) //字母a和下一行的b可以互换for(int b=0;b < 1 << n;b++){if(b&(a<<2) || a&(b<<2)) continue;for(int c=0;c< 1<<n;c++){if(c&(a<<2) || a&(c<<2)) continue;  //可以不写这一句if(c&(b<<1) || b&(c<<1)) continue;int t=get(b);for(int j=t;j<=k;j++)f[i][a][b][j] = (f[i][a][b][j] + f[i-1][c][a][j-t]) % mod;}}//最后的答案是f[m][a][b][k]int  res=0;for(int a=0;a< 1<<n;a++)for(int b=0;b< 1<<n;b++)res=(res+ f[m][a][b][k])%mod;cout<<res;
}

3494. 国际象棋相关推荐

  1. LeetCode简单题之判断国际象棋棋盘中一个格子的颜色

    题目 给你一个坐标 coordinates ,它是一个字符串,表示国际象棋棋盘中一个格子的坐标.下图是国际象棋棋盘示意图. 如果所给格子的颜色是白色,请你返回 true,如果是黑色,请返回 false ...

  2. java通用象棋游戏_在通用国际象棋界面周围模拟GraphQL包装器

    java通用象棋游戏 The Universal Chess Interface (UCI) has been around a long time and used by many chess en ...

  3. node seneca_使用Node.js和Seneca编写国际象棋微服务,第1部分

    node seneca (This is Part 1 of a three-part series [Part 2, Part 3]) (这是一个由三部分组成的系列文章的第1部分[ 第2 部分 , ...

  4. DeepMind 打造 AI 游戏系统,可以玩扑克、国际象棋、围棋等,战斗力爆表

    编译 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 谷歌母公司 Alphabet 的人工智能实验室 DeepMind 长期以来一直投资于游戏人工智能系统.实验室的理念是,游戏虽然缺 ...

  5. 一盘棋都没下过,AI只听人类评论比赛,就学会了国际象棋,还战胜了DeepChess...

    转载 栗子 发自 凹非寺 量子位 出品 | 公众号 QbitAI 一只AI要学会国际象棋,是不是一定要下过棋才行? 不一定. 伦敦大学学院的小伙伴们,开发了一只新的国际象棋AI,只看人类对比赛的评论, ...

  6. 中国象棋_通过设计国际象棋游戏来了解策略模式

    中国象棋 今天,我们将借助一个示例来尝试了解策略模式. 我们将考虑的示例是国际象棋游戏. 这里的目的是解释策略模式,而不是构建全面的国际象棋游戏解决方案. 策略模式:策略模式被称为行为模式–用于管理对 ...

  7. java模拟国际象棋游戏_java国际象棋小游戏

    [实例简介] 用java编写的国际象棋游戏 在eclipse环境下可以运行 界面美观 适合初学者 [实例截图] [核心代码] https___download.csdn.net_download_mo ...

  8. 三百年前的AI骗局:骗过美国总统和普鲁士大帝的国际象棋AI

    大数据文摘出品 编译:顾晨波,宋欣仪 人工智能的历史告诉我们:随着科技的进步,机器会越来越聪明,但却鲜少涉及人类在其中发挥的重要作用,包括怎么设计机器的原型,以及怎么训练它等等. 最近,IEEE Sp ...

  9. cpu性能测试软件 国际象棋,国际象棋、科学计算,整机性能测试

    Fritz:国际象棋 Fritz Chess Benchmark是一款国际象棋测试软件,但它并不是独立存在的,而是<Fritz9>这款获得国际认可的国际象棋程序中的一个测试性能部分.它可以 ...

最新文章

  1. 一堆让人惊喜的实用工具,也许你还不知道
  2. 谈谈redis的热key问题如何解决
  3. C#程序设计--入门到精通 学习记录(一) C# 与 .net平台
  4. android studil打断点_【小技巧】AndroidStudio利用断点打印日志
  5. 【机器学习基础】数学推导+纯Python实现机器学习算法14:Ridge岭回归
  6. 《编程之美》读书笔记(十二):“只考加法的面试题”
  7. 在Windows下使用CMake+MinGW搭建C/C++编译环境
  8. BIM工程信息管理系统搭建-系统功能需求
  9. 物联网已死,API 万岁!
  10. Ruby on Rails本地安装方法
  11. c++时间片轮转rr进程调度算法_进程,线程基础(—)
  12. Linux编译链接环境变量
  13. 基于51单片机的指纹考勤系统
  14. 《代码整洁之道》第14章 逐步改进 的代码片段
  15. confluence 制作流程图_Sketch制作交互流程图,哪种工具最高效?
  16. 什么是物联网技术?物联网主要技术有哪些?
  17. 例题 8-4 传送中的车(Fabled Rook, UVa 11134)
  18. 以太坊Ropsten测试网合并意味着什么?
  19. python未来前景,这是我见过最全的资料
  20. 计算机网络按照延伸距离划分为,计算机应用基础填空题

热门文章

  1. 【基础入门】(三)多路选择器
  2. DCS系统的电缆布设和接地
  3. Windows10下安装MXNet-走过的那些坑
  4. 用计算机随机出数,计算机是如何生成随机数的?
  5. 2D梳状滤波器和3D梳状滤波器
  6. 新类型杂志 - [网络媒体 imook]
  7. 《C++语言入门经典》一第1章 初识C++——“Hello World!” 1.1 C++的历史背景
  8. AD19过孔盖油处理
  9. [学习报告]《LeetCode零基础指南》(第2讲) 函数
  10. 2021江苏计算机二级考试报名,2021年秋季江苏省计算机等级考试报名通知