• hdu 4734 F(x) 数位dp


    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <cmath>
    #include <algorithm>
    #include <queue>
    #include <vector>
    #include <utility>
    using namespace std;
    
    const int maxw = (1<<9)*9;
    const int INF  = 0x3f3f3f3f;
    
    int dp[15][maxw];  //dp[i][j]表示前i个数位组成的数字中f(x)<=j的个数。
    int num[15];
    int A,B;
    int ans;
    int len;
    int W;
    
    void init()
    {
        for(int i=1; i<=9; i++)
        {
            int j;
            for(j=0; j<=9*((1<<i)-1); j++)
            {
                for(int k=0; k<=9 && j-k*(1<<(i-1))>=0; k++){
                    dp[i][j] += dp[i-1][j-k*(1<<(i-1))];
                }
            }
            for(;j<=maxw;j++) dp[i][j] = dp[i][9*((1<<i)-1)];
        }
    }
    
    int solve(int x)
    {
        int l=1;
        while(x!=0)
        {
            num[l++]=x%10;
            x=x/10;
        }
        return l;
    }
    
    void getW(int x)
    {
        int num;
        int cnt = 0;
        W = 0;
        while(x!=0)
        {
            num=x%10;
            W += num*(1<<cnt);
            cnt++;
            x=x/10;
        }
    }
    
    void dfs(int n,int w)
    {
        if(n == 0 )
        {
            ans += dp[n][w];
            return;
        }
    
        for(int i=0; i<num[n]; i++)    //A的第n位是num[n],则除了第n位是num[n]有限制,其他都没有。
        {
            if(w-i*(1<<(n-1)) < 0) continue;
            ans += dp[n-1][w-i*(1<<(n-1))];
        }
    
        if(w-num[n]*(1<<(n-1))>=0)
            dfs(n-1,w-num[n]*(1<<(n-1)));
    }
    int main()
    {
        //freopen("E:\acm\input.txt","r",stdin);
    
        memset(dp,0,sizeof(dp));
        for(int i=0; i<maxw; i++) dp[0][i] = 1;
    
        init();
    
        int T;
        cin>>T;
        for(int cas=1; cas<=T; cas++)
        {
            scanf("%d %d",&A,&B);
            getW(A);                //得到A的权值。
            len = solve(B);         //得到B的数位长度
    
            ans = 0;
            dfs(len-1,W);
    
            printf("Case #%d: %d
    ",cas,ans);
        }
    
    }
    View Code
  • 相关阅读:
    339. Nested List Weight Sum
    41. First Missing Positive
    366. Find Leaves of Binary Tree
    287. Find the Duplicate Number
    130. Surrounded Regions
    ubuntu18.04安装mongodb4.4
    阿里dataX配置使用
    MySQL主从同步简单介绍&配置
    阿里yugong配置使用
    ubuntu编译安装mysql
  • 原文地址:https://www.cnblogs.com/acmdeweilai/p/3321884.html
Copyright © 2020-2023  润新知