HDU_4734_数位dp

http://acm.hdu.edu.cn/showproblem.php?pid=4734

 

模版题。

 

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int dp[20000][15],a,b,num[15];

int dfs(int sum,int pos,int limit)
{
    if(pos == 0)    return sum >= 0;
    if(sum < 0)     return 0;
    if(!limit && dp[sum][pos] != -1)    return dp[sum][pos];
    int ans = 0,endd = limit?num[pos]:9;
    for(int i = 0;i <= endd;i++)
    {
        ans += dfs(sum-i*(1<<(pos-1)),pos-1,limit && i == endd);
    }
    if(!limit)  dp[sum][pos] = ans;
    return ans;
}
int main()
{
    memset(dp,-1,sizeof(dp));
    int T;
    scanf("%d",&T);
    for(int i = 1;i <= T;i++)
    {
        scanf("%d%d",&a,&b);
        int sum = 0,now = 1;
        while(a)
        {
            sum += a%10*now;
            now *= 2;
            a /= 10;
        }
        now = 1;
        while(b)
        {
            num[now] = b%10;
            now++;
            b /= 10;
        }
        printf("Case #%d: %d\n",i,dfs(sum,now-1,1));
    }
    return 0;
}

 

posted @ 2016-09-26 00:06  zzzzzzzzhu  阅读(172)  评论(0编辑  收藏  举报