poj3252 数位dp

来源:互联网 发布:开淘宝店描述怎么写 编辑:程序博客网 时间:2024/06/05 16:12

将原本10进制的数位,改成2进制的数位转移就好了

#include <cstdio>#include <cstring>#include <iostream>using namespace std;typedef long long ll;ll dp[35][35][35];int bit[12];ll dfs(int pos,int cn0,int cn1,int lim,int z){    if(pos==-1)    {        if(z==1) return 0;        if(cn0>=cn1) return 1;        return 0;    }    if(!lim&&dp[pos][cn0][cn1]!=-1) return dp[pos][cn0][cn1];    ll ans=0;    int en=lim?bit[pos]:1;    for(int i=0;i<=en;i++)    {        if(z&&i==0) ans+=dfs(pos-1,0,0,0,1);        else         {            if(i==0) ans+=dfs(pos-1,cn0+1,cn1,lim&&i==en,0);            if(i==1) ans+=dfs(pos-1,cn0,cn1+1,lim&&i==en,0);        }    }    if(!lim&&dp[pos][cn0][cn1]==-1) dp[pos][cn0][cn1]=ans;    return ans;}ll solve(ll x){    int len=0;    while(x)    {        bit[len++]=x%2;        x/=2;    }    return dfs(len-1,0,0,1,1);}int main(){    memset(dp,-1,sizeof(dp));    ll st,en;    while(~scanf("%lld%lld",&st,&en))        printf("%lld\n",solve(en)-solve(st-1));} 
0 0
原创粉丝点击