zoukankan      html  css  js  c++  java
  • hdu 3555 Bomb ( 数位DP)

    Bomb

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)
    Total Submission(s): 7926    Accepted Submission(s): 2780


    Problem Description
    The counter-terrorists found a time bomb in the dust. But this time the terrorists improve on the time bomb. The number sequence of the time bomb counts from 1 to N. If the current number sequence includes the sub-sequence "49", the power of the blast would add one point.
    Now the counter-terrorist knows the number N. They want to know the final points of the power. Can you help them?
     

    Input
    The first line of input consists of an integer T (1 <= T <= 10000), indicating the number of test cases. For each test case, there will be an integer N (1 <= N <= 2^63-1) as the description.

    The input terminates by end of file marker.
     

    Output
    For each test case, output an integer indicating the final points of the power.
     

    Sample Input
    3 1 50 500
     

    Sample Output
    0 1 15
    Hint
    From 1 to 500, the numbers that include the sub-sequence "49" are "49","149","249","349","449","490","491","492","493","494","495","496","497","498","499", so the answer is 15.
     


    思路:
    dp[i][0]表示不含49的个数 。
    dp[i][1]表示不含49且高位为9的个数;
    dp[i][2]表示包括49的个数;
    dp[i][0]=10*dp[i-1][0]-dp[i-1][1];  //不含49的数能够随意加10个数字。减去9前面加4的个数
    dp[i][1]=dp[i-1][0];                //不含49的数最高位加9
    dp[i][2]=dp[i-1][2]*10+dp[i-1][i]; //包括49的数字能够加入0~9,高位为9的能够加4;

    #include"stdio.h"
    #include"string.h"
    #include"iostream"
    #include"algorithm"
    #include"math.h"
    #include"vector"
    using namespace std;
    #define LL __int64
    #define N 25
    LL dp[N][3];
    void inti()
    {
        memset(dp,0,sizeof(dp));
        dp[0][0]=1;
        int i;
        for(i=1; i<N; i++)
        {
            dp[i][0]=dp[i-1][0]*10-dp[i-1][1];
            dp[i][1]=dp[i-1][0];
            dp[i][2]=dp[i-1][2]*10+dp[i-1][1];
        }
    }
    LL work(LL x)
    {
        int i,k,flag;
        int a[N];
        LL ans;
        k=0;
        while(x)
        {
            a[++k]=x%10;
            x/=10;
        }
        a[k+1]=ans=flag=0;
        for(i=k; i>0; i--)
        {
            ans+=a[i]*dp[i-1][2];
            if(flag)
                ans+=a[i]*dp[i-1][0];
            else
            {
                if(a[i]>4)
                    ans+=dp[i-1][1];
            }
            if(a[i+1]==4&&a[i]==9)
                flag=1;
            //     printf("%d
    ",ans);
        }
        return ans;
    }
    int main()
    {
        int T;
        LL n;
        inti();
        scanf("%d",&T);
        while(T--)
        {
            scanf("%I64d",&n);
            printf("%I64d
    ",work(n+1));
        }
        return 0;
    }
    


  • 相关阅读:
    新服务器上迁移项目遇到的问题
    xftp传输文件失败
    记录一些mysql常用命令
    微信APP支付
    状态码(更新中&#183;&#183;&#183;)
    yii ActiveRecord
    MySQL命令行自动补全——mycli安装
    MySQL优化总结
    MySQL读写分离架构——Atlas
    MySQL日志
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/8614949.html
Copyright © 2011-2022 走看看