. - 力扣(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)