寒假思维训练day21

今天更新一道不错的状态压缩DP题,顺带总结一下状态压缩DP。


                                        摘要:

                                               Part1   浅谈状态压缩DP的理解

                                               Part2   浅谈对状态机DP的理解

                                               Part3   关于状态压缩DP的1道例题


Part1  状态压缩DP

1、状态压缩DP:

事物的状态可能包含多个特征,但是事物的状态之间却可以互相转移,此时我们引入状态压缩DP,将事物的复杂的状态用一个数字来替代,此时事物的状态可以用数组的某个位置表示,从而可以进行状态的转移。

2、常见的状态表示:

(1) 用10进制数字本身表示状态,比如表示当前状态%某个数字的余数等等,这里举一个例子。
(2) 用10进制内蕴含的二进制位表示状态, 01, 表示了每个位置上的两种状态,它既可以表示是否存在,也可以表示数量的奇偶性。

(3) 用10进制内蕴含的K进制(除了10进制和2进制外的其它进制)表示状态,这种题我没见过,但是基于上面我们很容易可以推广。

3、什么时候我们可以用:

首先是在你的状态表示基础上,整体的转移图是一个拓扑图,也就是可以通过递推得来,并且时间空间可以过得去,此时我们就可以用状态压缩DP。


Part2 状态机DP

我在之前写过一篇关于状态机DP的文章,里面有详细的理论和几道很好的例题:

http://t.csdnimg.cn/POtFs


Part3  例题: 小红的回文数

题目链接:E-小红的回文数_牛客周赛 Round 32 (nowcoder.com)

(1)题意:

小红定义一个整数是“好数”,当且仅当该整数通过重排之后可以形成回文数。(可以包含前导零)现在小红拿到了一个正整数x,小红想截取一段连续区间得到好数,她想知道有多少种不同的方案? 1<= x <= 10^{10^5}


(2)题解: 

暴力显然会超时,必定需要n * n 的复杂度,此时我们不妨考虑一下DP,  我们此时从左到右去考虑这个数,我们考虑每个以第i位数结尾的情况,最后答案就是累加后的值,我们此时考虑一下以第i位数结尾的区间,我们发现对于一个数字而言,每位的数字只能是0-9的数字之一,我们不妨用10个二进制位表示每一种数字的数量%2是多少,这样我们就可以通过统计1的个数判断有几个奇数,如果要构造一个回文串,显然只能由一个或者0个奇数的位。
状态转移方程:F[i][state],表示以第i位数结尾的数字区间,且0-9各个的数字情况是state的方案数,F[i][state1] = F[i - 1][state1 \oplus (1 << a[i])],并且对于每个位单独一位的情况也要考虑,所以状态转移代码是: 

    vector<vector<int>> dp(n + 1, vector<int>((1 << 10) + 2)); dp[0][0] = 1;  for(int i = 1; i <= n; i ++ ) {for(int j = 0; j < (1 << 10); j ++ ) {int k = j ^ (1 << (s[i - 1] - '0'));dp[i][k] += dp[i - 1][j]; }if(i >= 2) dp[i][1 << (s[i - 1] - '0')] ++; }

你以为事情结束了吗,这是一道比较毒瘤的题,它会卡你的空间,在此基础上我们需要引入滚动数组优化,优化掉一维的空间。
此时的转移代码是:

    dp[0] = 1;  long long res = 0; for(int i = 1; i <= n; i ++ ) {memset(usdp, 0, sizeof usdp); for(int j = 0; j < 1 << 10; j ++ ) usdp[j ^ (1 << (s[i - 1] - '0'))] += dp[j];if(i >= 2) usdp[1 << (s[i  - 1] - '0')] ++; for(int j = 0; j < 1 << 10; j ++ ) {cnt = 0; for(int c = 0; c <= 9; c ++ ) if(j >> c & 1) ++ cnt; if(cnt <= 1) res += usdp[j]; dp[j] = usdp[j]; }}cout << res << endl; 

(3) 代码 (C ++):

滚动数组优化:
 

#include <bits/stdc++.h>
// #define int long long 
#define lowbit(x) (x&-x)
using namespace std; 
const int N = 1e5 + 2; 
const int inf = 0x3f3f3f3f; 
int n, cnt; 
long long dp[2025], usdp[2025];  
// int a[N]; 
void solve() {string s; cin >> s; n = s.size();cnt = 0; 
//     for(int i = 1; i <= n; i ++ ) a[i] = s[i - 1] - '0';  dp[0] = 1;  long long res = 0; for(int i = 1; i <= n; i ++ ) {memset(usdp, 0, sizeof usdp); for(int j = 0; j < 1 << 10; j ++ ) usdp[j ^ (1 << (s[i - 1] - '0'))] += dp[j];if(i >= 2) usdp[1 << (s[i  - 1] - '0')] ++; for(int j = 0; j < 1 << 10; j ++ ) {cnt = 0; for(int c = 0; c <= 9; c ++ ) if(j >> c & 1) ++ cnt; if(cnt <= 1) res += usdp[j]; dp[j] = usdp[j]; }}cout << res << endl; }
int main() {ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int ts = 1; 
//     cin >> ts; while(ts -- ) solve(); return 0; 
}

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

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

相关文章

算法基础——单调栈,单调队列

目录 1.单调栈 例题&#xff1a;【模板】单调栈 例题:求和 2.单调队列 例题&#xff1a;滑动窗口 1.单调栈 例题&#xff1a;【模板】单调栈 可以想象出一个柱状图&#xff0c;值越大&#xff0c;这个柱子越高 以此题的样例为例&#xff1a; 第一个数为7&#xff0c;想…

mysql全国省市县三级联动创表sql(一)

1. 建表sql CREATE TABLE province (id VARCHAR ( 32 ) PRIMARY KEY COMMENT 主键,code CHAR ( 6 ) NOT NULL COMMENT 省份编码,name VARCHAR ( 40 ) NOT NULL COMMENT 省份名称 ) COMMENT 省份信息表;CREATE TABLE city (id VARCHAR ( 32 ) PRIMARY KEY COMMENT 主键,code …

Atmel ATSHA204应用总结

1 ACES软件安装 Atmel Crypto Evaluation Studio (ACES) https://www.microchip.com/DevelopmentTools/ProductDetails/PartNO/Atmel%20Crypto%20%20Studio%20(ACES) 2 基本概念 ACES CE&#xff1a;Atmel Crypto Evalution Studio Configuration Environment&#xff08;基于加…

[Python] 如何用import导入模块

本篇博客来记以下关于import导入模块的笔记~ 可莉将这篇博客收录在了&#xff1a;《Python》 可莉推荐的优质博主主页&#xff1a;Kevin ’ s blog 我们在Python中可以使用import从标准库中导入一天模块&#xff0c;模块相当于是一个 .py 文件&#xff0c;我们导入后调用相当于…

Linux Chrome无法启动的原因(适用于Linux Edge)

文章目录 前言问题发现解决方案推广到Edge 前言 被Windows给贯坏了&#xff0c;因为Windows重启之后能够始终加载上一次没能关闭的页面&#xff0c;这就让我使用这种方法保存当前不想关、收藏了也容易忘的页面。结果这种操作直接导致Linux上的chrome就直接启动不了。记录一下解…

crack实验

资源下载 【免费】crack资源&#xff08;这玩意还要不少于11字&#xff09;资源-CSDN文库 内容 源码 这是一段简单的密码判断程序 流程 exe直接用ida开&#xff08;因该是release的exe&#xff09; 选中分支点直接按空格 此时的va地址是0010106e用动态调试软件调试&#xf…

tar 磁带归档工具

tar.gz 或者 tgz 文件的创建 1.先使用libtar 完成归档 2.在使用zlib gzip 压缩tar.gz 或者 tgz 文件的解压缩 1.先使用zlib gzip 解压缩 2.在使用libtar 解归档比较容易实现的方式

轻松入门MySQL:利用MySQL时间函数优化产品销售数据统计与分析(9)

在产品销售数据的统计与分析过程中&#xff0c;MySQL的时间函数是不可或缺的工具。这些函数能够帮助我们轻松处理各类时间需求&#xff0c;从而更有效地了解销售情况、评估业绩趋势和管理库存。本文将深入讨论不同类型的时间函数及其在产品销售数据分析中的应用&#xff0c;并结…

windows10|音视频剪辑|FFMPEG录屏和网络推流源初步的生成

前言&#xff1a; FFMPEG的功能强大是毋庸置疑的&#xff0c;那么录屏的需求大家在某些时候大家可能是非常需要的&#xff0c;例如&#xff0c;现有的项目需要演示&#xff0c;因此录制一段演示视频&#xff1b;亦或者做内容分发直播的&#xff0c;比如游戏主播&#xff0c;需…

人力资源智能化管理项目(day07:员工详情)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/humanResourceIntelligentManagementProject 页面结构和路由 <template><div class"dashboard-container"><div class"app-container"><div class"edit-form">…

使用python给程序添加授权码,设置授权时间、撤销授权和管理授权

文章目录 引言思路1思路2思路3客户端逻辑注册机逻辑服务器逻辑源码引言 有很多同学在开发程序的同时想要保护自己的源码不被他人窃取,这时候给程序添加授权就显得非常有必要了,下面主要分三块来讲述下如何开发,可以直接嵌入在你的程序中。 思路1 软件授权方案大概分成两个…

【实战】一、Jest 前端自动化测试框架基础入门(三) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(三)

文章目录 一、Jest 前端自动化测试框架基础入门7.异步代码的测试方法8.Jest 中的钩子函数9.钩子函数的作用域 学习内容来源&#xff1a;Jest入门到TDD/BDD双实战_前端要学的测试课 相对原教程&#xff0c;我在学习开始时&#xff08;2023.08&#xff09;采用的是当前最新版本&a…

python 通过ssh增量同步文件夹

要通过 SSH 使用 Python 进行文件夹的增量同步&#xff0c;你可以使用 paramiko 库来创建 SSH 连接并执行文件传输操作。paramiko 是一个 Python 实现的 SSHv2 协议库&#xff0c;可以用于进行 SSH 连接、文件传输等任务。 以下是一个简单的示例&#xff0c;展示如何使用 para…

ES实战-高级聚合

多桶型聚合 1.词条聚合–terms 2.范围聚合–range 3,直方图聚合–histogram 4.嵌套聚合 5.地理距离聚合 include(包含)exclude(不包含) GET /get-together/_search?pretty {"size": 0,"aggs": {"tags": {"terms": {"field"…

【教3妹学编程-算法题】捕获黑皇后需要的最少移动次数

3妹&#xff1a;2哥&#xff0c;新年好鸭~ 2哥 : 新年好&#xff0c;3妹这么早啊 3妹&#xff1a;是啊&#xff0c;新年第一天要起早&#xff0c;这样就可以起早一整年 2哥 :得&#xff0c;我还不了解你&#xff0c;每天晒到日上三竿 3妹&#xff1a;嘿嘿嘿嘿&#xff0c;一年是…

LeetCode、901. 股票价格跨度【中等,单调栈】

文章目录 前言LeetCode、901. 股票价格跨度【中等&#xff0c;单调栈】题目链接及分类思路思路1&#xff1a;暴力思路2&#xff1a;单调栈写法优化&#xff1a;单调栈简化写法(数组替代栈集合) 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、…

别人卖了 2W 的一套 ChatGPT 自动身份提示词!

别人卖了 2W 的一套 ChatGPT 自动身份提示词! 英文版 You are an Expert level ChatGPT Prompt Engineer with expertise in various subject matters. Throughout our interaction, you will refer to me as (your name). Lets collaborate to create the best possible Cha…

深度学习-吴恩达L1W2作业

作业1&#xff1a;吴恩达《深度学习》L1W2作业1 - Heywhale.com 作业2&#xff1a;吴恩达《深度学习》L1W2作业2 - Heywhale.com 作业1 你需要记住的内容&#xff1a; -np.exp&#xff08;x&#xff09;适用于任何np.array x并将指数函数应用于每个坐标 -sigmoid函数及其梯度…

springboot180基于spring boot的医院挂号就诊系统

医院挂号就诊系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装医院挂号就诊系统软件来发挥其…

Excel练习:折线图突出最大最小值

Excel练习&#xff1a;折线图突出最大最小值 ​​ 要点&#xff1a;NA值在折现图中不会被绘制&#xff0c;看似一条线&#xff0c;实际是三条线。换成0值和""都不行。 ‍ 查看所有已分享Excel文件-阿里云 ‍ 学习的这个视频&#xff1a;Excel折线图&#xff0c…