1 条题解
-
0
题目理解
我们需要统计 区间内满足以下两个条件的 位手机号码数量:
- 至少包含 个相邻的相同数字(如 , 等)
- 不能同时包含数字 和
手机号码是 位,没有前导 。
数据范围分析
- 都是 位数,范围
- 直接枚举不可行:区间大小可能达到
数位DP方法
这是典型的数位统计问题,可以使用数位DP解决。
状态设计
我们需要记录以下信息:
- 位置 :当前处理到第几位(从高位到低位,0-based)
- 边界限制 :之前是否紧贴上界
- 前导零 :之前是否都是前导零(本题号码固定11位,可简化)
- 是否有三个连续相同数字 :0/1 表示是否已满足条件1
- 数字8和4的出现状态 :
- 0:既没有8也没有4
- 1:有8没有4
- 2:有4没有8
- 3:同时有8和4(非法状态)
- 前两个数字 :记录前两位的数字(用于判断连续三个相同)
状态转移
设 表示状态下的方案数。
对于当前位置,枚举数字 从 到 :
- 如果 且 等于上界的当前位,则下一位仍受限制
- 更新 :如果 ,则出现三个连续相同
- 更新 :
- 如果 :
- 如果 :
- 更新 :,
特殊处理
前导零问题
由于手机号码是固定11位,没有前导零,所以:
- 第一位只能从 到
- 其他位可以从 到
非法状态剪枝
如果 (同时有8和4),直接返回
最终有效状态
只有当 且 时,才计数为有效方案
算法流程
- 将 和 转换为数字数组
- 定义数位DP函数 :计算 中满足条件的号码数
- 答案 =
- DP记忆化搜索:
- 边界: 时,检查 和
- 转移:枚举当前位数字,更新状态
样例验证
输入:
12121284000 12121285550计算过程:
- :统计到该数的满足条件号码数
- :统计到 的满足条件号码数
- 差值即为 区间内的数量
满足条件的号码:
- :有 ,只有 没有
- :有 ,只有 没有
- :有 ,只有 没有
- :有 ,只有 没有
- :有 ,只有 没有
输出:
5✓
复杂度分析
- 状态数:$11 \times 2 \times 2 \times 4 \times 10 \times 10 = 17600$
- 每次转移:最多 种选择
- 总复杂度:,非常高效
总结
本题的关键在于:
- 识别出这是数位统计问题,使用数位DP
- 设计合适的状态记录必要信息(连续数字、8/4出现情况)
- 处理边界条件和状态转移
- 使用记忆化搜索避免重复计算
这是一个典型的数位DP问题,考察了对状态设计和记忆化搜索的掌握程度。
- 1
信息
- ID
- 4572
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者