[hdu4734]F(x)数位dp

题意:求0~f(b)中,有几个小于等于 f(a)的。

解题关键:数位dp

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=50002;
int dp[12][maxn],a[12];
int get(int x){
    int pos=0;
    while(x){
        a[pos++]=x%10;
        x/=10;
    }
    return pos;
}
int f(int x){
    if(x==0) return 0;
    return f(x/10)*2+x%10;
}
int dfs(int pos,int sta,bool limit){
    if(pos==-1) return sta>=0;
    if(sta<0) return 0;
    if(!limit&&dp[pos][sta]) return dp[pos][sta];
    int ans=0,up=limit?a[pos]:9;        //这里注意一下 
    for(int i=0;i<=up;i++){
        ans+=dfs(pos-1,sta-i*(1<<pos),limit&&i==a[pos]);
    }
    if(!limit) dp[pos][sta]=ans;
    return ans;
}
int main(){
    int T;
    scanf("%d",&T);
    for(int kase=1;kase<=T;kase++){
        int n,m;
        scanf("%d%d",&n,&m);
        int pos=get(m);
        int ans=dfs(pos-1,f(n),true);
        printf("Case #%d: %d\n",kase,ans);
    } 
    return 0;
}

 

posted @ 2017-11-04 13:48  Elpsywk  阅读(152)  评论(0编辑  收藏  举报