zoukankan      html  css  js  c++  java
  • BZOJ-1833(数位DP)

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    ll a,b;
    int k[20];
    ll dp[20][10];
    ll sum[20];
    ll ddfs(int pos,int lead,bool limit){
        if(pos == -1)return 1;
        if(!limit && !lead && sum[pos])return sum[pos];
        int up = limit ? k[pos]:9;
        ll res = 0;
        for(int i=0;i<=up;i++){
            res += ddfs(pos-1,lead && i==0,limit && i == k[pos]);
        }
        if(!limit && !lead)sum[pos] = res;
        return res;
    }   
    ll dfs(int pos,int x,bool lead,bool limit){
        if(pos == -1)return lead;
        if(!limit && !lead && dp[pos][x])return dp[pos][x];
        int up = limit ? k[pos] : 9;
        ll res = 0;
        for(int i=0;i<=up;i++){
            if(lead){
                if(i == 0){
                    res += dfs(pos-1,x,lead,false);continue;
                }
            }
            
            if(i == x){
                res += ddfs(pos-1,false,limit && i == k[pos]);
                res += dfs(pos-1,x,false,limit && i == k[pos]);
            }
            else res += dfs(pos-1,x,false,limit && i == k[pos]);
        }
        if(!limit && !lead)dp[pos][x] = res;
        return res;
    }
    ll solve(ll x,int z){
        int pos = 0;
        while(x){
            k[pos++] = x%10;
            x/=10;
        }
        return dfs(pos-1,z,true,true);
    }
    int main(){
        scanf("%lld%lld",&a,&b);
        for(int i=0;i<=9;i++){
            printf("%lld ",solve(b,i) - solve(a-1,i));
        }
        //printf("%lld
    ",dp[0][1]);
        puts("");
        return 0;
    }
    
  • 相关阅读:
    vs13的内存占用 关闭之
    Java基础 -5
    Java基础 -4.6
    Java基础 -4.5
    Java基础 -4.4
    Java基础 -4.3
    Java基础 -4.2
    Java基础 -4
    Java基础 -3.5
    Java基础 -3.4
  • 原文地址:https://www.cnblogs.com/1625--H/p/10876844.html
Copyright © 2011-2022 走看看