hdu 4734 F(x) 数位DP

来源:互联网 发布:天刀男号捏脸数据 编辑:程序博客网 时间:2024/06/03 19:50

题意:

给出计算公式,寻找0~b之间满足条件的数字个数

思路:

对于dp [i ] [ j ] 表示了i位数字 不大于j的数字个数和

#include <stdio.h>#include <cstring>#include <algorithm>#include <iostream>using namespace std;int dp[15][50000];int digit[20];int split(int num){    int ans=0;    int k=1;    while(num)    {        ans+=(num%10)*k;        k<<=1;        num/=10;    }    return ans;}int dfs(int len,int ans,int limit){    if(ans<0)return 0;    if(len<0)return ans>=0;    if(!limit&&dp[len][ans]!=-1)        return dp[len][ans];    int sum=0;    int last= limit? digit[len]:9;    for(int i=0;i<=last;i++)    {        sum+=dfs(len-1,ans-i*(1<<len),limit&&last==i);    }    if(!limit) dp[len][ans]=sum;    return sum;}int solve(int top,int b){    int cnt=0;    while(b)    {        digit[cnt++]=b%10;        b/=10;    }    return dfs(cnt-1,top,1);}int main(){    int t;    memset(dp,-1,sizeof(dp));    scanf("%d",&t);    for(int cs=1;cs<=t;cs++)    {        int a,b;        scanf("%d%d",&a,&b);        int tmp=split(a);        printf("Case #%d: %d\n",cs,solve(tmp,b));    }    return 0;}


原创粉丝点击