狀壓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
英文地址,請注明出處:http://en.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;…