• hdu3555(数位dp)


    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3555

    题意:求区间[a,b]内包含有'49'的数的总个数。

    分析:dp[pos][0]表示到第pos位没有包含49,后面1~pos-1位任意填时的总个数,dp[pos][1]表示到第pos位时前一位刚好是'4',后面任意填时的总个数,dp[pos][2]表示已经包含49后面任意填的总个数。。。

    #include <cstdio>
    #include <cstring>
    #include <string>
    #include <cmath>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <cstdlib>
    #include <stack>
    #include <vector>
    #include <set>
    #include <map>
    #define LL long long
    #define mod 10007
    #define inf 0x3f3f3f3f
    #define N 100010
    #define FILL(a,b) (memset(a,b,sizeof(a)))
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    using namespace std;
    LL dp[22][3];
    int dig[22];
    LL dfs(int pos,int pre,bool flag,bool limit)
    {
        if(pos==0)return flag;
        if(!limit&&flag&&~dp[pos][2])return dp[pos][2];
        if(!limit&&!flag&&pre==4&&~dp[pos][1])return dp[pos][1];
        if(!limit&&!flag&&pre!=4&&~dp[pos][0])return dp[pos][0];
        int len=limit?dig[pos]:9;
        LL ans=0;
        for(int i=0;i<=len;i++)
        {
            if(pre==4&&i==9)ans+=dfs(pos-1,i,flag||1,limit&&i==len);
            else ans+=dfs(pos-1,i,flag||0,limit&&i==len);
        }
        if(!limit)//分情况记录状态
        {
            if(flag)dp[pos][2]=ans;
            else if(pre==4)dp[pos][1]=ans;
            else dp[pos][0]=ans;
        }
        return ans;
    }
    LL solve(LL x)
    {
        int len=0;
        while(x)
        {
            dig[++len]=x%10;
            x/=10;
        }
        LL ans=dfs(len,0,0,1);
        return ans;
    }
    int main()
    {
        LL n,T;
        scanf("%I64d",&T);
        while(T--)
        {
            scanf("%I64d",&n);
            memset(dp,-1,sizeof(dp));
            printf("%I64d
    ",solve(n));
        }
    }
    View Code
  • 相关阅读:
    Intern Day15
    Intern Day15
    Intern Day15
    Intern Day15
    Intern Day15
    Intern Day14
    Intern Day14
    纯CSS序列号
    屌丝、高富帅、文艺青年、土豪的区别
    什么是文艺
  • 原文地址:https://www.cnblogs.com/lienus/p/4248378.html
Copyright © 2020-2023  润新知