a,b=map(str,input().split())
a='0'*(len(b)-len(a))+a
dp=[[-1 for i in range(10)] for j in range(len(b)+1)]
def f(x,pre,islimit,islowlimit,isnum): #如果isnum为false,则不考虑相差大于2
if x==len(b) and isnum:
return 1
if dp[x][pre]!=-1 and not islimit and not islowlimit: #如果没有限制,且记录过了
return dp[x][pre]
res = 0
low=int(a[x]) if islowlimit else 0 #最低位
up=int(b[x]) if islimit else 9 #最高位
for i in range(low,up+1):
if not isnum: #如果前面都是0,则第一位不用考虑相差2
res += f(x + 1, i, islimit and i == up, islowlimit and i == low, isnum or i != 0)
else:
if abs(i-pre)>=2: #否则这一位要相差2
res+=f(x+1,i,islimit and i==up,islowlimit and i==low,isnum or i!=0) #一定要返回是否前面全是0,isnum!!
if not islimit and not islowlimit: #没有限制就存一下 !!
dp[x][pre]=res
return res
ans=f(0,-2,True,True,False)
print(ans)
数位DP模版题。洛谷windy数
最新推荐文章于 2025-12-13 11:28:09 发布
本文介绍了一个使用Python编写的函数,通过动态规划解决字符串中数字之间的最大允许差异问题,确保相邻数字之差不超过2。函数`f`通过递归计算满足条件的解的数量。
9285

被折叠的 条评论
为什么被折叠?



