码迷,mamicode.com
首页 > 其他好文 > 详细

数位DP

时间:2016-11-15 08:25:09      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:limit   cstring   pre   scanf   ems   turn   div   cas   cst   

#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;
}

//HDU4734

 

数位DP

标签:limit   cstring   pre   scanf   ems   turn   div   cas   cst   

原文地址:http://www.cnblogs.com/zhurb/p/6064249.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!