• Hdu Bomb(数位DP)


    Bomb
    Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)
    Total Submission(s): 16713 Accepted Submission(s): 6128
    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
    HintFrom 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.
    Author
    fatboy_cw@WHU
    Source
    2010 ACM-ICPC Multi-University Training Contest(12)——Host by WHU

    /*
    数位DP.
    f[i][j]表示以j开头的i位数的决策.
    倒序存储
    最后还要加一位统一开区间处理. 
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define MAXN 25
    #define LL long long
    using namespace std;
    LL f[MAXN][MAXN],ans,n;
    int t,l,a[MAXN];
    void pre()
    {
        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];
              }
        return ;
    }
    void slove()
    {
        n++;ans=n;
        l=0;memset(a,0,sizeof a);
        while(n) a[++l]=n%10,n/=10;
        a[l+1]=0;
        for(int i=l;i;i--)
        {
            for(int j=0;j<a[i];j++)
            {
                if(a[i+1]==4&&j==9) continue;
                ans-=f[i][j];
            }
            if(a[i]==9&&a[i+1]==4) break;
        }
        cout<<ans<<endl;
        return ;
    }
    int main()
    {
        pre();scanf("%d",&t);
        while(t--) cin>>n,slove();
        return 0;
    }
  • 相关阅读:
    05.Zabbix自动化监控
    k8s容器编排
    docker容器
    第一章·ELKstack介绍及Elasticsearch部署
    第二章·Elasticsearch内部分片及分片处理机制介绍
    第三章·Logstash入门-部署与测试
    第四章·Kibana入门-安装,索引添加及界面功能
    第五章·Logstash深入-日志收集
    第六章·Logstash深入-收集java日志
    第七章·Logstash深入-收集NGINX日志
  • 原文地址:https://www.cnblogs.com/nancheng58/p/10068122.html
Copyright © 2020-2023  润新知