zoukankan      html  css  js  c++  java
  • hdu3555 数位dp

    题意:求1到n的数中含49的有多少个

    和上一题类似,但是这题如果直接算含49的会有一点问题,所以先算不含49的然后用n-就好了,注意求1到n算的是n+1的

    还有就是这题有毒,必须要用__int64而不能用long long,而且需要交c++,不能用G++

    非递归

    #include<map>
    #include<set>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstdio>
    #include<cassert>
    #include<iomanip>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define C 0.5772156649
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    
    using namespace std;
    
    const double g=10.0,eps=1e-7;
    const int N=20+10,maxn=1000000+10,inf=0x3f3f3f;
    
    __int64 f[N][N];
    void init()
    {
        memset(f,0,sizeof f);
        f[0][0]=1;
        for(int i=1;i<=20;i++)
            for(int j=0;j<=9;j++)
                for(int k=0;k<=9;k++)
                {
                    if(j==4&&k==9)continue;
                    f[i][j]+=f[i-1][k];
                }
    }
    __int64 getnum(__int64 x)
    {
        __int64 ans=0,len=0,digit[30];
        while(x)
        {
            digit[++len]=x%10;
            x/=10;
        }
        for(int i=len;i>=1;i--)
        {
            for(int j=0;j<digit[i];j++)
                if(j!=9||digit[i+1]!=4)
                   ans+=f[i][j];
            if(digit[i]==9&&digit[i+1]==4)break;
        }
        return ans;
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        init();
        int t;
        cin>>t;
        while(t--)
        {
            __int64 n;
            cin>>n;
            cout<<n+1-getnum(n+1)<<endl;
        }
        return 0;
    }
    /********************
    
    ********************/
    View Code

     递归

    #include<map>
    #include<set>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstdio>
    #include<cassert>
    #include<iomanip>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define C 0.5772156649
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    using namespace std;
    
    const double g=10.0,eps=1e-7;
    const int N=20+10,maxn=1000000+10,inf=0x3f3f3f;
    
    __int64 dp[N][N],digit[N];
    __int64 dfs(int len,bool state,bool fp)
    {
        if(!len)return 1;
        if(!fp&&dp[len][state]!=-1)return dp[len][state];
        __int64 ans=0,fpmax=fp ? digit[len] : 9;
        for(int i=0;i<=fpmax;i++)
        {
            if(i==9&&state)continue;
            ans+=dfs(len-1,i==4,fp&&i==fpmax);
        }
        if(!fp)dp[len][state]=ans;
        return ans;
    }
    __int64 solve(__int64 x)
    {
        int len=0;
        while(x)
        {
            digit[++len]=x%10;
            x/=10;
        }
        return dfs(len,0,1);
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int t;
        cin>>t;
        memset(dp,-1,sizeof dp);
        while(t--)
        {
            __int64 n;
            cin>>n;
            cout<<n+1-solve(n)<<endl;
        }
        return 0;
    }
    /********************
    
    ********************/
    View Code
  • 相关阅读:
    洛谷P1072 Hankson 的趣味题(题解)
    18.3.19晚听韩明睿大佬讲题收获
    题解+新技巧--一本通1282:最大子矩阵
    题解-洛谷P1303 A*B Problem(高精)
    Java重载和覆盖
    propagation属性的7个传播行为
    脏读、不可重复读、幻读
    RSA 数据加密和数字签名算法
    大型互联网站解决高并发的常见策略
    死锁和活锁
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/7417692.html
Copyright © 2011-2022 走看看