当前位置: 首页 > news >正文

数位DP——AcWing 1081. 度的数量

数位DP

定义

数位DP是一种动态规划技巧,特别适用于处理与数字的位操作相关的问题,如数字序列的计数、数字的生成等问题。它通过将问题分解为对每一位数字的独立考虑,从而简化问题复杂度,实现高效求解。

数位DP的核心思想是将原问题转化为对每一位数字进行决策的过程,利用动态规划的思想,从最低位向最高位(或相反)逐位考虑,每一步决策都基于当前已经确定的位数的信息。在这个过程中,通常会用一个状态表示当前处理到哪一位以及之前决策产生的某些约束条件(如数字大小、奇偶性等),并使用一个DP数组来记录到达每个状态的有效解的数量或方案。

运用情况

  1. 数字序列计数:例如,计算某个区间内满足特定条件的数的个数(如:包含偶数个1的数、不包含连续相同数字的数等)。
  2. 数字序列生成:找出所有满足给定条件的数字序列。
  3. 数字组合问题:比如,给定一个数字N,求所有由N的非空子集构成的数之和。
  4. 数字游戏问题:如,猜数字游戏中最小猜测次数等。

注意事项

  1. 状态定义:清晰准确地定义DP状态是关键,通常包括当前处理的位数、已使用的数字集合或限制条件等。
  2. 状态转移方程:根据问题的具体条件,合理设计从一位到下一位的转移逻辑,正确计算状态之间的转移。
  3. 初始化与边界条件:注意DP数组的初始化,尤其是处理最高位或最低位时的特殊处理。
  4. 遍历顺序:根据问题的特性选择从低到高还是从高到低遍历数字位,确保状态转移的正确性。
  5. 剪枝:对于一些问题,合理的剪枝可以大幅度减少计算量,提高效率。

解题思路

  1. 明确问题:首先要明确问题的具体要求,识别出需要根据数位进行决策的点。
  2. 状态定义:定义DP状态,通常涉及当前处理的位数、前导零的处理、已使用数字的限制等。
  3. 确定DP数组维度:根据状态定义,决定DP数组的维度和大小。
  4. 构建状态转移方程:分析如何从前一状态转移到当前状态,这一步是数位DP中最核心的部分。
  5. 实现与优化:编写代码实现DP算法,同时注意优化,如剪枝、记忆化等技巧以提高效率。
  6. 边界与初始值处理:确保DP过程的起始状态和边界条件被正确设置。
  7. 回溯构造答案(如果需要):在计数之外还需要具体方案时,需要根据DP过程回溯构造出满足条件的数字序列。

AcWing 1081. 度的数量   

题目描述

AcWing 1081. 度的数量 - AcWing

运行代码

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 35;int l, r, k, b;
int a[N], al;
int f[N][N];int dp(int pos, int st, int op) //op: 1=,0<
{//枚举到最后一位数位,是否恰有k个不同的1(也是递归的终止条件)if (!pos) return st == k;//记忆化搜索,前提是不贴着上界(可以枚举满这一位所有的数字)if (!op && ~f[pos][st]) return f[pos][st];//01数位dp,贴着上界时,本轮能枚举的最大数就是上界数位的数字和1之间的最小值int res = 0, maxx = op ? min(a[pos], 1) : 1;for (int i = 0; i <= maxx; i ++ ){if (st + i > k) continue;res += dp(pos - 1, st + i, op && i == a[pos]);}return op ? res : f[pos][st] = res;
}
int calc(int x)
{al = 0; memset(f, -1, sizeof f);        //模板的必要初始化步骤while (x) a[ ++ al] = x % b, x /= b;  //把x按照进制分解到数组中return dp(al, 0, 1);
}
int main()
{cin >> l >> r >> k >> b;cout << calc(r) - calc(l - 1) << endl;return 0;
}

代码思路

  1. 头文件引入:程序包括了iostreamcstringalgorithm,分别用于输入输出、内存操作和算法操作。

  2. 常量定义N定义了数组的最大大小,这里设置为35,意味着可以处理的数字范围是010^34

  3. 变量定义:定义了区间的左右边界lr,数字的个数k,底数b,以及用于存储数字分解的数组a和数组长度alf是一个二维数组,用于存储中间结果,实现记忆化搜索。

  4. 递归函数dp:这个函数是一个递归函数,用于计算在给定的数位pos,已经使用了st个不同的1,是否能够形成满足条件的数。参数op用于标识是否是边界条件。

  5. 分解函数calc:这个函数将输入的整数x按照底数b分解,然后调用dp函数计算满足条件的数的数量。

  6. 主函数main:读取输入,调用calc函数计算结果,并输出满足条件的数的数量。

改进思路

  1. 记忆化搜索:代码中已经使用了记忆化搜索,这有助于减少重复计算。但是,可以进一步优化记忆化搜索的逻辑,确保只存储必要的状态。

  2. 数组初始化:在使用memset初始化f数组时,使用-1作为初始值,这有助于在递归过程中检查某个状态是否已经被计算过。

  3. 递归终止条件:在dp函数中,递归的终止条件是pos为0,这意味着已经处理完所有的数位。这个条件是正确的,但可以进一步优化递归的逻辑,减少不必要的递归调用。

  4. 循环优化:在dp函数的内部循环中,可以进一步优化循环的终止条件,避免不必要的迭代。

  5. 输入输出优化:虽然这个程序的输入输出操作已经很简洁,但在处理大量数据时,可以考虑使用更快的输入输出方法,比如使用scanfprintf代替cincout

  6. 代码可读性:代码中的变量命名可以进一步改进,以提高代码的可读性。例如,使用更具描述性的变量名,而不是单字母或缩写。

  7. 错误处理:程序没有包含错误处理逻辑,比如输入数据超出预期范围的情况。在实际应用中,应该添加适当的错误检查和处理。

相关文章:

数位DP——AcWing 1081. 度的数量

数位DP 定义 数位DP是一种动态规划技巧&#xff0c;特别适用于处理与数字的位操作相关的问题&#xff0c;如数字序列的计数、数字的生成等问题。它通过将问题分解为对每一位数字的独立考虑&#xff0c;从而简化问题复杂度&#xff0c;实现高效求解。 数位DP的核心思想是将原…...

2024下半年必追国漫片单,谁将问鼎巅峰?

随着2024年上半年的落幕&#xff0c;国漫市场再度迎来了百花齐放的盛况。从经典续作到全新IP&#xff0c;从玄幻到科幻&#xff0c;每一部作品都以其独特的魅力吸引着观众的目光。本期为大家盘点下半年值得一看的国漫佳作&#xff0c;大胆预测&#xff0c;谁将成为这场神仙打架…...

信息发布小程序h5 uniapp thinkphp

纯手工uniapp thinkphp 全开源打造 信息发布小程序 一、概述 信息发布小程序是一种基于微信平台的小程序应用&#xff0c;旨在为用户提供便捷的信息发布与展示服务。用户可以通过该小程序快速发布各类信息&#xff0c;如招聘、寻物、公告等&#xff0c;同时也可以浏览和搜索…...

Windows定时任务执行脚本

场景&#xff1a;由于网络波动原因导致云数据库没连接上&#xff0c;从而导致某个流程引擎链接不上数据库从而导致该流程引擎服务挂了&#xff0c;网络恢复后 数据库链接正常&#xff0c;但是该引擎服务还是中止状态。 解决方案&#xff1a;在Windows中新建一个定时任务&#…...

优维“统一开放平台”:开放、开发、集成、客制化

基于丰富完善的产品体系&#xff0c;优维重磅推出了统一开放平台。这款由优维自主设计与研发&#xff0c;集数据开发、能力开放、能力集成、客制化为一体的统一开放平台&#xff0c;具备应用市场、应用开发、连接能力、采控平台、API集市、开发者工具等功能模块&#xff0c;可为…...

ChatGPT新纪元:揭秘GPT-4o的多模态能力

GPT-4o登场 探索ChatGPT的多模态创新 今日凌晨&#xff0c;OpenAI向全球宣布了AI发展的新篇章——GPT-4o&#xff0c;每次OpenAI发布重大更新时&#xff0c;尽管令人兴奋&#xff0c;但也不免使众多初创公司的梦想破灭。 GPT-4o的命名中的“o”象征着“omni”——全能的代表。…...

泰勒斯威夫特2022年纽约大学毕业典礼演讲:NYU‘s 2022 Commencement Speaker Taylor Swift

NYU’s 2022 Commencement Speaker Taylor Swift Link: https://www.youtube.com/watch?vOBG50aoUwlI Singer, songwriter, producer, and director Taylor Swift received a Doctor of Fine Arts, honoris causa, at the Commencement for the Class of 2022 and delivered …...

(四)SvelteKit教程:调用外部 API 获取数据

&#xff08;四&#xff09;SvelteKit教程&#xff1a;调用 API 我们先按照如下的方式来构建api服务&#xff1a; step 1:npm i json-serverstep 2:在根目录下新建 db.json 文件&#xff0c;内部写入如下内容&#xff1a;{"users": [{"id": 1,"name…...

数据结构-分析期末选择题考点(排序)

何似清歌倚桃李 一炉沈水醉红灯 契子 ✨ 上一期给大家提供了大概会考的题型给老铁们复习的大致思路 这一期还会是一样&#xff0c;我将整理一下排序的题型以及解题方法给你们 由于时间还很多&#xff0c;我就慢慢总结吧&#xff0c;一天一章的样子&#xff0c;明天总结串、后天…...

Python:探索高效、智能的指纹识别技术(简单易懂)

目录 概括 导入库 函数一 参数&#xff1a; 函数二 函数三 主函数 运行结果 src&#xff1a; model_base 7.bmp ​编辑 总结 概括 指纹识别是一种基于人体生物特征的身份验证技术。它通过捕捉和分析手指上的独特纹路和细节特征&#xff0c;实现高准确度的身份识别。…...

『SD』AI绘画,不会写提示词怎么办?

提示词 有没有想过&#xff0c;为什么你用 SD 生成的猫是长这样的。 而其他人可以生成这样的猫。 虽然生成的都是猫&#xff0c;但猫与猫之间还是有差距的。 如果你的提示词只是“cat”&#xff0c;那大概率就会出现本文第一张图的那个效果。而如果你加上一些形容词&#xff…...

搭建大型分布式服务(四十二)SpringBoot 无代码侵入实现多Kafka数据源整合插件发布

系列文章目录 文章目录 系列文章目录前言MultiKafkaStarter [V2.2]一、功能特性二、快速开始&#xff08;生产端&#xff09;三、快速开始&#xff08;消费端&#xff09;四、其它特性五、变更记录六、参考文章 前言 在分布式服务的架构演进中&#xff0c;消息队列作为核心组件…...

Python 学习路线及技巧

一、学习路线 1. 基础阶段 ● 学习 Python 的语法基础&#xff0c;如变量、数据类型、运算符、控制流等。 ● 掌握常用的 Python 标准库&#xff0c;如 os、sys、re、datetime 等。 ● 通过编写简单的程序来巩固基础&#xff0c;如计算器、字符串处理等。 2. 进阶阶段 ● 深入…...

计算机网络知识整理笔记

目录 1.对网络协议的分层&#xff1f; 2.TCP/IP和UDP之间的区别&#xff1f; 3.建立TCP连接的三次握手&#xff1f; 4.断开TCP连接的四次挥手&#xff1f; 5.TCP协议如何保证可靠性传输&#xff1f; 6.什么是TCP的拥塞控制&#xff1f; 7.什么是HTTP协议&#xff1f; 8…...

练习 String翻转 注册处理 字符串统计

p493 将字符串中指定部分进行翻转 package chapter;public class reverse {public static void main(String[] args) {String str "abcdef";str reverseMethod(str,0,3);System.out.println(str);}public static String reverseMethod(String str, int start, in…...

linux的常用系统维护命令

1.ps显示某个时间点的程序运行情况 -a &#xff1a;显示所有用户的进程 -u &#xff1a;显示用户名和启动时间 -x &#xff1a;显示 没有控制终端的进程 -e &#xff1a;显示所有进程&#xff0c;包括没有控制终端的进程 -l &#xff1a;长格式显示 -w &#xff1a;宽…...

java:aocache 0.4.0 缓存控制机制

aoocache发布第一个版本0.1.0时&#xff0c;没有考虑到使用aocache的项目对方法缓存的控制需求。 场景 给同事做培训时&#xff0c;同事提到这个需求&#xff0c;他希望能够有方法主动去清理指定方法的缓存&#xff1a; 他的数据是由其他服务启动时提供的&#xff0c;他的方法…...

试析C#编程语言的特点及功能

行步骤&#xff0c;而不必创建新方法。其声明方法是在实例化委托基础上&#xff0c;加一对花括号以代表执行范围&#xff0c;再加一个分号终止语句。 2.3.3 工作原理 C#编译器在“匿名”委托时会自动把执行代码转换成惟一命名类里的惟一命名函数。再对存储代码块的委托进行设…...

Textual Learning2 -- 使用时的小问题

1、出现的问题&#xff1a; 在vscode里面直接运行函数会显示报错&#xff1a; 我尝试在vscode中含textual库的环境下运行&#xff0c;但仍然报错 2、解决方案&#xff1a; 在命令行中运行&#xff1a; 首先按winR&#xff0c;输入cmd打开命令行 或在已经安装的conda环境&a…...

CST--如何在PCB三维模型中自由创建离散端口

在使用CST电磁仿真软件进行PCB的三维建模时&#xff0c;经常会遇到不能自动创建离散端口的问题&#xff0c;原因有很多&#xff0c;比如&#xff1a;缺少元器件封装、开路端口、多端子模型等等&#xff0c;这个时候&#xff0c;很多人会选择手动进行端口创建&#xff0c;但是&a…...

C++中的虚函数表结构框架

一.虚函数表介绍 Virtual Table虚函数表是实现多态的 每个有虚函数的类的实现&#xff0c;都有个指向虚函数的指针表&#xff08;不管是父类还是子类&#xff09; 指向虚表的指针是作为数据成员存在实例对象中 当调用虚函数时&#xff0c;就去查找对象的虚表中指向整顿派生类函…...

【ES】--Elasticsearch的高亮模式

目录 一、高亮策略1、Fast Vector Highlighter(快速向量高亮器)2、Posting Highlighter(帖子高亮器)3、Unified Highlighter(统一高亮器)4、Plain Highlighter(普通高亮器)5、总结二、高亮参数三、高亮案例解析1、words_one配置解析2、words_two配置解析3、words_three…...

使用matlab开发stm32总结,stm32-matlab常见的问题处理以及报错合集

1&#xff0c;问题&#xff1a;本来是好的&#xff0c;突然编译运行报错&#xff0c;说是确少包&#xff0c; 解决方案&#xff1a;重启以后好了 2&#xff0c;有完美的马鞍波&#xff0c;为什么不能够转动呢&#xff1f; 原因是我这里模型的问题&#xff0c;我计算出来的是占…...

落石滑坡监测报警系统:创新保障高速公路安全

​ ​​在现代交通建设中&#xff0c;高速公路的安全性和稳定性至关重要。特别是易发生落石区域&#xff0c;如何有效预防和应对落石滑坡带来的事故成为了一项关键性挑战。为此&#xff0c;落石滑坡监测报警系统应运而生&#xff0c;它通过先进的技术手段&#xff0c;为高速…...

Linux开发讲课20--- QSPI

SPI 是英语 Serial Peripheral interface 的缩写&#xff0c;顾名思义就是串行外围设备接口&#xff0c;一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在芯片的管脚上只占用四根线&#xff0c;节约了芯片的管脚&#xff0c;为 PCB 的布局上节省空间…...

VMware ESXi 8.0U3 macOS Unlocker OEM BIOS 集成驱动版,新增 12 款 I219 网卡驱动

VMware ESXi 8.0U3 macOS Unlocker & OEM BIOS 集成驱动版&#xff0c;新增 12 款 I219 网卡驱动 VMware ESXi 8.0U3 macOS Unlocker & OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版) 发布 ESXi 8.0U3 集成驱动版&#xff0c;在个人电脑上运行企业级工作负载 请访…...

vuepress使用简介及个人博客搭建

目录 一、介绍二、环境准备三、安装运行vuepress四、目录结构五、配置文件六、导航栏配置七、导航栏logo八、浏览器图标九、侧边栏配置十、添加 Git 仓库和编辑链接十一、部署到GitHub十二、搭建成功 一、介绍 VuePress 是 Vuejs 官方提供的一个是Vue驱动的静态网站生成器&…...

c#文件读写

1.1读取文件 方法说明​File.ReadAllText(FilePath);​读取指定路径的文件​File.ReadAllText(FilePath, Encoding);​通过指定编码格式来读取指定文件​File.ReadAllBytes();​读取二进制文件&#xff0c;并把内容读取到一个字节数组​File.ReadAllLines();​以行的形式读取文…...

WIFI 企业级认证手段 EAP-TLS介绍

EAP-TLS&#xff08;EAP-Transport Layer Security&#xff09;被认为是WLAN网络里最安全的认证方法&#xff0c;因此被企业广泛采用。本文会针对EAP-TLS的基本原理进行介绍。 在介绍原理之前&#xff0c;先介绍下WLAN网络里认证加密手段涉及到的一些基本概念。 1 802.1x IEE…...

【网络架构】keepalive

目录 一、keepalive基础 1.1 作用 1.2 原理 1.3 功能 二、keepalive安装 2.1 yum安装 2.2 编译安装 三、配置文件 3.1 keepalived相关文件 3.2 主配置的组成 3.2.1 全局配置 3.2.2 配置虚拟路由器 四、实际操作 4.1 lvskeepalived高可用群集 4.2 keepalivedngi…...

专门做游戏攻略的网站/徐州seo代理计费

计算机网络的体系结构&#xff1a; 法律上的(de jure)国际标准 OSI 并没有得到市场的认可。 是非国际标准 TCP/IP 现在获得了最广泛的应用。 TCP/IP 常被称为事实上的(de facto) 国际标准。 计算机网络中的数据交换必须遵守事先约定好的规则。   这些规则明确规定了所交换…...

外管局网站做延期收款报告/收录网站

作为一个想一次通过PMP考试的老考试人。 刷题、报班、看视频、看教材甚至是通过人的经验贴都不会放过的我&#xff0c;只要是与通过PMP考试有关的都想去看看了解了解&#xff0c;避避坑。 但是内容有太多&#xff0c;而且考试的经验也就只能看看&#xff0c;在自己身上好像没…...

周口做网站/色盲测试图数字

刻木结绳、算数九章、“1”与“0”……数字&#xff0c;始终与人类文明相生相伴。如今&#xff0c;随着大数据、物联网、人工智能等技术的进步&#xff0c;数字经济蓬勃发展&#xff0c;网络购物、移动支付等新业态、新模式层出不穷&#xff0c;深刻改变着我们的经济形态和生活…...

企业网站排名运营/咨询公司

经常看到有人写的如下的IBM MQ客户端代码: MQEnvironment.port 1414; MQEnvironment.hostname "147.151.240.48"; MQEnvironment.channel "SYSTEM.DEF.SVRCONN"; MQEnvironment.properties.put(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES); //1…...

网站建设广告模板/正规拉新推广平台有哪些

问题描述&#xff1a;早上巡检是发现一套RAC的ora.chad一个节点的状态是offline&#xff0c;其他的均正常。crsctl stat res -tora.chadONLINE ONLINE csdb2-bm001 STABLEOFFLINE OFFLINE csdb2-bm002 STABLE解决&#xff1a;ora.chad是Cluster Health Advisor …...

asp个人网站源码/电商运营基本知识

和昨天差不多 一种暴力去重 昨天方法对结果set 一种中间去重 暴力去重是直接算出结果后用set insert class Solution { public:vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {vector<vector<int>>res;sor…...