-
E - Round Numbers
- POJ - 3252
- 题意:Round Number 被称为其二进制形式中0的个数>=1的个数。求[x,y]区间内“Round Number”的个数.
- 初步想法正常数位dp进行搜缩搜到一个数时去getsum一下里面0,1数,但没想好如何记忆化,而且题目的要求按照十进制的数位进行 记忆化确实没有意义,这里他想要找的数字都是对二进制有要求所以直接按照二进制进行数位dp。dp数组三维分别代表数位0的个数1的个数 ,所以数位dp要根据题目的要求去进行搜索 。灵活多变。
-
#include<iostream> #include<stdio.h> #include<cstring> using namespace std; #define ll long long #define maxn 60 int a[maxn],dp[maxn][maxn][maxn]; ll l,r; ll dfs(int len,bool first,int num0,int num1,bool limit) { if(len==0)return num0>=num1; if(!limit&&dp[len][num0][num1]>=0) return dp[len][num0][num1]; ll ans=0; int up=(limit?a[len]:1); for(int i=0; i<=up; i++) { int t0=num0+1; int t1=num1+1; if(i==0) t0++; else t1++; if(first&&i==0) ans+=dfs(len-1,1,0,0,limit&&i==up); else ans+=dfs(len-1,0,t0,t1,limit&&i==up); } if(!limit) dp[len][num0][num1]=ans; return ans; } ll solve(ll num) { ll cnt=0; while(num) { a[++cnt]=num%2; num/=2; } return dfs(cnt,1,0,0,1); } int main() { memset(dp,-1,sizeof(dp)); scanf("%lld%lld",&l,&r); printf("%lld\n",solve(r)-solve(l-1)); return 0; }
E - Round Numbers-二进制数位DP
最新推荐文章于 2021-01-18 09:14:47 发布