. - 力扣(LeetCode) dp问题不会做,自己值分析到斐波那契数列为止 from functools import cache class Solution: def findIntegers(self, n: int) -> int: """ 0 2 00 2+1 000 2+1+2 0000 2+1+2+3 00000 2+1+2+3+5 000000 2+1+2+3+5+8 0000000 2+1+2+3+5+8+13 由规律可得n位二进数不连续为1的值的个数=(n-1)不连续为1的值的个数+(n-2)不连续为1的值的个数 Sn=(Sn-1)+(Sn-2) 是一个斐波那契序列的变种 n=1时=2,n=2时=3 使用位数DP解题 """ s = bin(n)[2:] n = len(s) @cache def dfs(cur: int, pre: int, is_limit: int) -> int: if cur == n: return 1 up = ord(s[cur]) - ord("0") if is_limit else 1 ans = dfs(cur + 1, 0, is_limit and up == 0) if pre == 0 and up == 1: ans += dfs(cur + 1, 1, is_limit) return ans return dfs(0, 0, 1)