数位DP模版题。洛谷windy数

本文介绍了一个使用Python编写的函数,通过动态规划解决字符串中数字之间的最大允许差异问题,确保相邻数字之差不超过2。函数`f`通过递归计算满足条件的解的数量。
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)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值