[LEETCODE600] 不含連續1的非負整數 - 數位dp
阿新 • • 發佈:2020-11-22
Description
給定一個正整數 \(n \le 10^9\),找出小於或等於 \(n\) 的非負整數中,其二進位制表示不包含連續的 \(1\) 的個數。
Solution
\(f(i,j,full)\) 表示從高到低處理到第 \(i\) 位,第 \(i\) 位是 \(j\),當前是否貼合上界。對 full=0
的情況記憶化一下即可。
class Solution { public: int f[35][2]; Solution() { memset(f,-1,sizeof f); } int solve(int pos,int last,int full,vector<int>& a) { if(pos<0) return 1; if(!full&&~f[pos][last]) return f[pos][last]; int lim=full?a[pos]:1; int ans=0; for(int now=0;now<=lim;now++) { if(last==1&&now==1) continue; ans+=solve(pos-1,now,full&&now==a[pos],a); } if(!full) f[pos][last]=ans; return ans; } int findIntegers(int num) { vector <int> a; while(num) { a.push_back(num&1); num>>=1; } if(a.size()==0) return 0; return solve(a.size()-1,0,1,a); } };