AcWing 3710:递进数字 ← 最高位到最低位 DFS 枚举 + 南京大学考研机试题
【题目来源】
https://www.acwing.com/problem/content/3713/
【题目描述】
给定两个整数 l,r(l≤r),请问 [l, r] 范围内,满足数字的任意相邻两位差值都恰好为 1,且数字至少有两位的数有多少个。
【输入格式】
第一行包含整数 T,表示共有 T 组测试数据。
每组数据占一行,包含两个整数 l 和 r。
【输出格式】
每组数据输出一行,一个结果。
【输入样例】
14 2023
【输出样例】
1
17
【数据范围】
1≤T≤100,
0≤l≤r≤3×10^8
【算法分析】
● 从最高位到最低位枚举,最高位有 1~9 共 9 种选择(最高位不能为 0)。其后的每一位,因为要满足“任意相邻两位差值都恰好为 1”的约束条件,所以,最高位之后的每一位的值,只有两种选择。鉴于题目给出的最大数为 3×10^8,故总的选择数为 9×2^8=2304。
● 也就是说,从最高位到最低位枚举求解,不会超时(TLE)。
● 下面代码中,函数 dfs 的各个形参含义:u表示当前数的位数,x表示当前数的值,pre记录上一位数的值。
【算法代码:】
【算法代码:数位DP】→
【参考文献】

浙公网安备 33010602011771号