zoukankan      html  css  js  c++  java
  • HDU 3555 Bomb

    本题求一个数包含49的个数,典型数位DP问题。

    状态表示:(f[len][state]):当前为第len位,当前已统计的数字的状态为state。

    其中,state有(0,1,2)三种值:

    1. state == 1,表示上一位为4
    2. state == 2,表示高位已存在49
    3. state == 0,其他情况
    LL f[20][3];
    int a[20];
    LL n;
    
    LL dfs(int len,int state,bool limit)
    {
        if(!len) return state==2;
        if(!limit && ~f[len][state]) return f[len][state];
    
        int num=limit?a[len-1]:9;
        LL res=0;
        for(int i=0;i<=num;i++)
        {
            if(state == 2 || (state == 1 && i == 9))
                res+=dfs(len-1,2,limit&&i==num);
            else
                res+=dfs(len-1,i==4,limit&&i==num);
        }
    
        if(!limit) f[len][state]=res;
        return res;
    }
    
    LL dp(LL n)
    {
        int len=0;
        while(n)
        {
            a[len++]=n%10;
            n/=10;
        }
        return dfs(len,0,1);
    }
    
    int main()
    {
        memset(f,-1,sizeof f);
    
        int T;
        cin>>T;
        while(T--)
        {
            cin>>n;
            cout<<dp(n)<<endl;
        }
        //system("pause");
        return 0;
    }
    
  • 相关阅读:
    【转】linux常用命令
    【转】C++三大特性
    插入排序
    shixi
    【转】TCP协议
    【转】排序算法稳定性
    面筋BD
    斐波那契数列
    【面试题】D
    【学习笔记】OI模板整理
  • 原文地址:https://www.cnblogs.com/fxh0707/p/14424429.html
Copyright © 2011-2022 走看看