news 2026/9/6 12:42:26

【数位DP】蓝桥云课 - 小蓝的生日礼物(Windy数) 题解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【数位DP】蓝桥云课 - 小蓝的生日礼物(Windy数) 题解

【数位DP】蓝桥云课 - 小蓝的生日礼物 题解

1. 题目概述

  • 题目名称:小蓝的生日礼物
  • 题目大意:在区间[ a , b ] [a, b][a,b]中,挑选满足“相邻两位的数字之差至少为 2”的整数,求满足条件的数字个数。
  • 数据规模1 ≤ a ≤ b ≤ 10 9 1 \le a \le b \le 10^91ab109

2. 解题思路

本题是典型的**数位 DP(数位动态规划)**问题,要求统计区间[ a , b ] [a, b][a,b]内满足特定数位限制的数字数量。

  1. 区间转换
    通过前缀和思想,求区间[ a , b ] [a, b][a,b]内满足条件的个数,可以转化为求解solve(b) - solve(a - 1),其中solve(x)表示求[ 0 , x ] [0, x][0,x]范围内符合条件的数字个数。

  2. DFS 状态设计
    通过记忆化搜索来实现数位 DP:

    • pos:当前处理到的数位(从高位向低位)。
    • pre:前一位填入的数字(用于判断相邻差值是否≥ 2 \ge 22)。
    • lead:前导零标记。如果为true,说明前面全为 0,当前位填 0 仍属于前导零,不触发相邻差值的限制。
    • limit:最高位限制标记。如果为true,当前位最大只能填到原数在该位的数字;若为false,则可填0~9
  3. 状态转移与记忆化

    • pos == -1时,说明成功构造了一个合法数字,返回1
    • !limit && !lead时,说明当前状态不受上限限制且已离开前导零阶段,结果具有通用性,可以保存在dp[pos][pre]中,后续重复遇到可直接返回。

3. C++ 源码

#include<bits/stdc++.h>usingnamespacestd;longlongdp[15][15];vector<int>num;/** * @brief 数位 DP 记忆化搜索 * @param pos 当前处理的数位索引(从高到低) * @param pre 前一位填入的数字 * @param lead 是否包含前导零 * @param limit 是否受到最高位限制 */intdfs(intpos,intpre,boollead,boollimit){if(pos==-1)return1;// 递归基:构造完成一个数// 记忆化检索if(!lead&&!limit&&dp[pos][pre]!=-1){returndp[pos][pre];}longlongres=0;intup=limit?num[pos]:9;// 当前可填的最大数字for(intd=0;d<=up;d++){if(lead){if(d==0){// 仍处于前导零状态res+=dfs(pos-1,0,true,limit&&(d==up));}else{// 离开前导零状态res+=dfs(pos-1,d,false,limit&&(d==up));}}else{// 正常填数,需满足相邻差值 >= 2if(abs(d-pre)>=2){res+=dfs(pos-1,d,false,limit&&(d==up));}}}// 状态记录if(!limit&&!lead){dp[pos][pre]=res;}returnres;}/** * @brief 计算 [0, x] 范围内满足条件的数字个数 */longlongsolve(longlongx){if(x<0)return0;num.clear();while(x){num.push_back(x%10);x/=10;}if(num.empty())num.push_back(0);returndfs(num.size()-1,0,true,true);}intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);memset(dp,-1,sizeof(dp));longlongA,B;if(cin>>A>>B){cout<<solve(B)-solve(A-1)<<"\n";}return0;}

4. 复杂度分析

  • 时间复杂度:最大位数L ≈ 10 L \approx 10L10(对于10 9 10^9109级别的数)。状态数为位数 × 前一位数字 = 10 × 10 = 100 \text{位数} \times \text{前一位数字} = 10 \times 10 = 100位数×前一位数字=10×10=100种,每个状态遍历0 ∼ 9 0 \sim 909转移,运行时间不超过 1ms,完全满足时间限制。
  • 空间复杂度O ( L × 10 ) O(L \times 10)O(L×10),使用极少的额外内存(数位 DP 数组仅需15 × 15 15 \times 1515×15)。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/6 12:38:43

岳麓区劳务公司代账排名情况如何?

岳麓区劳务公司代账排名情况分析核心概述&#xff1a;在岳麓区&#xff0c;劳务公司寻找代账服务时&#xff0c;往往会关注代账排名情况。不过&#xff0c;目前并没有官方统一的代账排名。湖南巨勤财务管理咨询有限公司作为当地一家有特色的财税服务公司&#xff0c;在为劳务公…

作者头像 李华
网站建设 2026/9/6 12:37:05

第 21 讲 军用 FPGA 信号处理开发全指南:XCKU060 硬件 BOM、开发环境、信号架构、工程化流程

专栏名称:《Linux 从零基础到全场景实战:服务器・嵌入式・网络安全三合一》 文章定位:付费军工 FPGA 实战落地篇;基于 Xilinx XCKU060-2FFVA1156M 军用级芯片,针对军用信号处理的高可靠、宽温抗辐、实时性要求,完整输出硬件物料清单、开发资源栈、信号处理架构、全流程开…

作者头像 李华
网站建设 2026/9/6 12:35:20

IEEE 802.1AS-2020解析:gPTP与TSN时间同步的工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/6 12:33:48

纸板缺陷纸箱表面缺陷检测数据集VOC+YOLO格式1055张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数)&#xff1a;1055标注数量(xml文件个数)&#xff1a;1055标注数量(txt文件个数)&#xff1a;1055标注类别…

作者头像 李华
网站建设 2026/9/6 12:33:14

本体驱动的AI大模型

文章目录前言本书的核心思想与完整结构本体论在大模型时代的核心价值适合读者购买链接前言 在人工智能发展的历史长河中&#xff0c;每一次范式的跃迁都伴随着深刻的理论重构与实践突破。当回顾最近几年AI的发展&#xff0c;大语言模型&#xff08;以下简称大模型&#xff09;无…

作者头像 李华
网站建设 2026/9/6 12:33:14

车载CAN与UDS诊断协议栈开发:从采样点到ISO-TP服务实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华