数位DP-600. 不含连续1的非负整数

问题描述

给定一个正整数 n ,返回范围在 [0, n] 都非负整数中,其二进制表示不包含 连续的 1 的个数。

示例 1:

输入: n = 5
输出: 5
解释:
下面是带有相应二进制表示的非负整数<= 5:
0 : 0
1 : 1
2 : 10
3 : 11
4 : 100
5 : 101
其中,只有整数3违反规则(有两个连续的1),其他5个满足规则。
示例 2:

输入: n = 1
输出: 2
示例 3:

输入: n = 2
输出: 3

提示:

1 <= n <= 109

问题求解

class Solution:
    def findIntegers(self, n: int) -> int:
        s = "{:b}".format(n)
        
        @cache
        def f(i, is_limit, prev):
            if i == len(s):
                return 1
            
            res = 0
            up = int(s[i]) if is_limit else 1

            for d in range(0, up + 1):
                if d == 1 and prev == 1:
                    continue
                res += f(i + 1, is_limit and d == up, d)
            
            return res
        
        return f(0, True, 0)
posted @ 2022-08-14 21:41  hyserendipity  阅读(13)  评论(0编辑  收藏  举报