• hdu2089(数位dp模版)


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

    前导零:前导零 是一种 显示数字前面的0的一种格式,比如:000,222.340这样 的好处是 格式对齐..比如我们要求是3位数的 数字001002003..010011.这样有前导零 会更好记录和排序

    ac代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define per(i,a,b) for(int i=a;i <= b;i++)
    #define max(a,b) a=max(a,b)
    #define min(a,b) a=min(a,b)
    #define sz(x) (int)x.size()
    typedef long long ll;
    ll gcd(ll a,ll b){while(b){ll t=b;b=a%b;a=t;}return a;}
    const int inf=0x3f3f3f3f;
    const int mod=1000000007;
    #define siz 40005
    int n,m,a[10],dp[10][2];//dp[pos][sta]表示前一位sta状态下这一位及之后的数位构成的所有可能
    ll dfs(int pos,int pre,int sta,bool limit)//这里sta的值是0/1,用来区分pre是不是6
    {//limit用来判断前一位是不是数位上界,是则本位不能取到大于a[pos]的数
        if(pos==-1)return 1;
        if(!limit&&dp[pos][sta]!=-1)return dp[pos][sta];
        int up=limit?a[pos]:9;
        ll ans=0;
        for(int i=0;i<=up;i++){
            if(i==4||(pre==6&&i==2))continue;
            ans+=dfs(pos-1,i,i==6,limit&&i==a[pos]);
        }
        if(!limit)dp[pos][sta]=ans;
        return ans;
    }
    ll solve(int u)
    {
        int cnt=0;
        while(u){
            a[cnt++]=u%10;
            u/=10;
        }
        return dfs(cnt-1,-1,false,true);
    }
    
    int main()
    {
        memset(dp,-1,sizeof(dp));
        while(scanf("%d %d",&n,&m)!=EOF&&(n||m)){
            printf("%lld
    ",solve(m)-solve(n-1));
        }
        return 0;
    }
  • 相关阅读:
    Go语言学习笔记(3)
    Haskell语言学习笔记(97)Phantom Type
    Rust语言学习笔记(12)
    堆排序 Rust实现
    Rust 智能指针(Rc)
    Rust 泛型
    Rust 枚举
    Rust 结构体
    Rust 引用
    二叉搜索树
  • 原文地址:https://www.cnblogs.com/WindFreedom/p/9481176.html
Copyright © 2020-2023  润新知