数位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)