状压DP总结

前言

一般来讲 n n n 数据范围在 10 ~ 25 之间都是可以进行状态压缩的 -> 2 n 2^n 2n 状压

The 2024 Shanghai Collegiate Programming Contest Problem G.象棋大师

在这里插入图片描述

  • 知识点:线性DP,状压DP,预处理 辅助转移的技巧

首先看到 n*n 的方格而且只能向右下方向走,而且还是求解方案数,就可以想到是很经典的线性DP模型;
但这道题有一点不一样,有些点是不能走的,因为有马看着,其次就是,马的状态也不一定,可能也会被吃掉,那么对应的一些格子是可以走的

所以我们很自然的就可以想到用不用记录一下马的剩余状态,来判断一些格子能还是不能走呢?

这就需要我们再在二维dp的基础上再开一维,用于记录马的状态,题目中马的数量只有 10, 2 10 2^{10} 210 = 1024
空间和时间的压力都是可以承受的

但是又有一个问题,O(n * n * 1000) 这时候的复杂度就已经很高了,1e7,然后我还得再在每次循环后把每匹马的状态处理出来(*10),然后再枚举每个马的周围八个方向(*8),然后再枚举别的马看有没有别蹄(*10)…

此时我们惊人的发现复杂一度逼近 1e10,这显然是不能接受的,这是就要进行预处理了:

预先处理一个数字,判断当马的状态是 state 的时候哪些格子是安全的,也是一个和 f 数组一样大的数组,但是有了它我们就可以不用处理那么多东西,代码也会好写很多。

参考代码如下,大家也可以有别的写法,譬如直接枚举转移点周围的八个点看有没有马,这样也许就不用预处理g数组了,只是那样的代码太难写了,我没有调出来,就不放了。

void solve()
{int n, m;cin >> n >> m;int M = 1LL << m;vector<PII> hou(m);vector<vector<int>> vis(n + 1, vector<int>(n + 1, -1));for (int i = 0; i < m; i++) {cin >> hou[i].first >> hou[i].second;vis[hou[i].first][hou[i].second] = i;}vector<vector<vector<int>>> g(n + 1, vector<vector<int>>(n + 1, vector<int>(M))), f = g;for (int sta = 0; sta < M; sta++) {for (int i = 0; i < m; i++) {if (sta >> i & 1) {for (int k = 0; k < 8; k++) {int x = hou[i].first + dx[k], y = hou[i].second + dy[k];if (x < 0 || x > n || y < 0 || y > n) continue;int cx = hou[i].first + dx_[k / 2], cy = hou[i].second + dy_[k / 2];if (cx < 0 || cx > n || cy < 0 || cy > n) {g[x][y][sta] = 1;continue;}int id = vis[cx][cy];if (id != -1 && (sta >> id & 1)) {continue;}g[x][y][sta] = 1;}}}}if (g[0][0][M - 1]) f[0][0][M - 1] = 0;else f[0][0][M - 1] = 1;for (int i = 0; i <= n; i++) {for (int j = 0; j <= n; j++) {if (i == 0 && j == 0) continue;for (int sta = 0; sta < M; sta++) {if (vis[i][j] == -1) {int num1 = 0, num2 = 0;if (i > 0) num1 = f[i - 1][j][sta];if (j > 0) num2 = f[i][j - 1][sta];if (!g[i][j][sta]) f[i][j][sta] = (num1 + num2) % mod;else f[i][j][sta] = 0;} else {int id = vis[i][j];if (!(sta >> id & 1)) continue;int num1 = 0, num2 = 0;if (i > 0) num1 = f[i - 1][j][sta];if (j > 0) num2 = f[i][j - 1][sta];if (!g[i][j][sta ^ (1 << id)]) f[i][j][sta ^ (1 << id)] = (num1 + num2) % mod;else f[i][j][sta ^ (1 << id)] = 0;}}}}   int ans = 0;for (int i = 0; i < M; i++) {if (!g[n][n][i]) {(ans += f[n][n][i] % mod) %= mod;}}cout << ans << endl;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:
http://www.pswp.cn/web/79767.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/79767.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQLite 转换为 MySQL 数据库

一、导出 SQLite 数据库 1. 使用 SQLite 命令行工具 • 打开终端&#xff08;在 Linux 或 macOS 上&#xff09;或命令提示符&#xff08;在 Windows 上&#xff09;。 • 输入sqlite3 your_database_name.db&#xff08;将 your_database_name.db 替换为你的 SQLite 数据库…

【技巧】使用UV创建python项目的开发环境

回到目录 【技巧】使用UV创建python项目的开发环境 0. 为什么用UV 下载速度快、虚拟环境、多版本python支持、清晰的依赖关系 1. 安装基础软件 1.1. 安装python 下载地址&#xff1a;https://www.python.org/downloads/windows/ 1.2. 安装UV > pip install uv -i ht…

Java SpringMVC 和 MyBatis 整合项目的事务管理配置详解

目录 一、事务管理的基本概念二、在 SpringMVC 和 MyBatis 整合项目中配置事务管理1. 配置数据源2. 配置事务管理器3. 使用事务注解4. 配置 MyBatis 的事务支持5. 测试事务管理三、总结在企业级应用开发中,事务管理是确保数据一致性和完整性的重要机制。特别是在整合了 Spring…

Nakama:让游戏与应用更具互动性和即时性

在现代游戏和应用程序开发中,实现社交互动和实时功能已成为用户体验的核心需求。为满足这种需求,许多开发者正转向分布式服务器技术,在这些技术中,Nakama 构建起了一座桥梁。Nakama 是一个开源的分布式服务器,专门为社交和实时游戏及应用程序设计,为开发者提供了强大的工…

项目中会出现的css样式

1.重复渐变边框 思路&#xff1a; 主要是用重复的背景渐变实现的 如图&#xff1a; <div class"card"><div class"container">全面收集中医癌毒临床医案&#xff0c;建立医案共享机制&#xff0c;构建癌毒病机知识图谱&#xff0c;便于医疗人…

数组和切片的区别

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

Jenkins企业级实战

目标 在Windows操作系统上使用Jenkins完成代码的自动拉取、编译、打包、发布工作。 实施 1.安装Java开发工具包&#xff08;JDK&#xff09; Jenkins是基于Java的应用程序&#xff0c;因此需要先安装JDK。可以从Oracle官网或OpenJDK下载适合的JDK版本。推荐java17版本&#x…

C++ 异常捕获 try 和 __try的区别笔记

最近碰到了try 和 __try的区别的问题&#xff0c;经过实测与验证&#xff0c;发现在vs2019下&#xff0c;确实存在try无法捕获特定异常的问题&#xff0c;比如下面的代码&#xff1a; //以空格作为分割符的符号个数 //内存复制功能 // test1.cpp : 定义控制台应用程序的入口点…

Spark基础介绍

1. Spark 核心概念 1.1 RDD&#xff08;弹性分布式数据集&#xff09; 定义&#xff1a;RDD&#xff08;Resilient Distributed Dataset&#xff09;是 Spark 的核心抽象&#xff0c;是不可变、可分区、容错的分布式数据集合。特性&#xff1a; 弹性&#xff1a;自动进行内存…

采用SqlSugarClient创建数据库实例引发的异步调用问题

基于SqlSugar编写的多个WebApi接口&#xff0c;项目初始化时采用单例模式注册SqlSugarClient实例对象&#xff0c;前端页面采用layui布局&#xff0c;并在一个按钮事件中通过Ajax连续调用多个WebApi接口获取数据。实际运行时点击按钮会随机报下面几种错误&#xff1a; Execute…

[原创](现代Delphi 12指南):[macOS 64bit App开发]: 如何获取当前用户主目录(即:~波浪符号目录)?

[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、…

pdf url 转 图片

背景&#xff1a;vue2.0需要把pdf转成图片&#xff0c;显示在url里面&#xff0c;使用pdfjs-dist来解决 步骤&#xff1a; 1、安装依赖包(我的项目是node12&#xff0c;安装太高版本会报错) npm i pdfjs-dist2.16.105 2、vue代码 <template><div class"main…

理解 Open vSwitch (OVS)

Open vSwitch&#xff08;简称 OVS&#xff09;是一个开源的 虚拟交换机&#xff0c;主要用于 虚拟化环境&#xff08;如 KVM、Xen、Docker&#xff09;和 软件定义网络&#xff08;SDN&#xff09;。它类似于物理交换机&#xff0c;但在软件层面实现&#xff0c;可以灵活地管理…

S7-1500——零基础入门1、工业编程基本概念

工业编程基本概念 一,数制与基本数据类型二,数字量信号三,模拟量信号一,数制与基本数据类型 本节主要内容 类别内容主题数制与基本数据类型数制讲解十进制、十六进制、二进制及其进位规则;基数、位权概念数据类型介绍PLC 使用的数据类型:未序列数据类型(bit、byte、wor…

kotlin-协程(什么是一个协程)

1.什么指一个协程对于线程来说一个thread就是就是指一个线程&#xff0c;thread为什么成为线程呢&#xff1f;因为他实现了对线程的一个抽象管理&#xff0c;可以管理这个线程&#xff0c;启动&#xff0c;可以查看各种信息 那么协程呢&#xff1f; public fun CoroutineScop…

七、深入 Hive DDL:管理表、分区与洞察元数据

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月13日 专栏&#xff1a;Hive教程 内容导航 一、表的 DDL 操作 (非创建)二、分区的 DDL 操作三、洞察元数据&#xff1a;SHOW 命令的威力结语&#xff1a;DDL 与 SHOW&#xff0c;Hive 管理的双翼练习题一、选择题二、代码题…

【 Redis | 实战篇 短信登录 】

前言&#xff1a; 主要完成了基于Session实现登录&#xff0c;解决集群的Session共享问题&#xff0c;从而实现了基于Redis来实现共享Session登录 1.基于Session实现登录 1.1.发送短信验证码 步骤&#xff1a; 前端提交手机号 》校验手机号 》不符合返回错误信息&#xff0…

蓝桥杯14届国赛 合并数列

问题描述 小明发现有很多方案可以把一个很大的正整数拆成若干正整数的和。他采取了其中两种方案&#xff0c;分别将他们列为两个数组 {a1,a2,...,an} 和 {b1,b2,...,bm}。两个数组的和相同。 定义一次合并操作可以将某数组内相邻的两个数合并为一个新数&#xff0c;新数的值是…

Doris和Clickhouse对比

目录 一、Doris和Clickhouse对比1. 底层架构**DorisClickHouse** 2. 运行原理DorisClickHouse 3. 使用场景DorisClickHouse 4. 优缺点对比总结 二、MPP架构和Shared-Nothing 架构对比1. 什么是 MPP 架构&#xff1f;定义特点典型代表 2. 什么是 Shared-Nothing 架构&#xff1f…

niushop单商户V5多门店版V5.5.0全插件+商品称重、商家手机端+搭建环境教程

一.系统介绍 【全开源】niushop单商户V5多门店版V5.5.0版本&#xff0c;我看很多人都想要 商品称重、商家手机端等插件这套是全插件版本&#xff0c;整合起来本博主也花了不少啦~ Niushop系统是应用thinkphp6开发的完善的电商系统&#xff0c;拥有完善的商品机制&#xff0c;…