• hdu3555 Bomb(数位dp)


                                                       Bomb

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

    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.
    Author
    fatboy_cw@WHU
     
    Source
    推荐一份题解 写的很好  点我
     
    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cctype>
    #include<cmath>
    #include<cstring>
    #include<map>
    #include<stack>
    #include<set>
    #include<vector>
    #include<algorithm>
    #include<string.h>
    typedef long long ll;
    typedef unsigned long long LL;
    using namespace std;
    const int INF=0x3f3f3f3f;
    const double eps=0.0000000001;
    const int N=100;
    ll dp[N][N];
    int a[N];
    void init(){
        memset(dp,0,sizeof(dp));
        dp[0][0]=1;dp[0][1]=0;dp[0][2]=0;
        for(int i=1;i<=20;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][1]+dp[i-1][2]*10;
        }
    }
    int main()
    {
        int T;
        init();
        scanf("%d",&T);
        while(T--){
            memset(a,0,sizeof(a));
            ll n;
            scanf("%I64d",&n);
            n++;
            int t=0;
            while(n){
                a[++t]=n%10;
                n/=10;
            }
            a[t+1]=0;
            int flag=0;
            ll sum=0;
            for(int i=t;i>=1;i--){
                sum=sum+dp[i-1][2]*a[i];
                if(flag==0&&a[i]>4)  sum=sum+dp[i-1][1];
                if(flag)    sum=sum+dp[i-1][0]*a[i];
                if(a[i+1]==4&&a[i]==9)  flag=1;
            }
            cout<<sum<<endl;
        }
        return 0;
    }

     
  • 相关阅读:
    Ubuntu vsftp复制文件到远端时错误,Permission denied
    linux 常用命令
    vbox安装ubuntu之后挂载共享文件夹无权限访问的问题以及改了主机名,导致命令行不能解析主机名的问题
    java 中的valueOf方法和强转
    读写文件,用代码在讲html文件转为jsp文件
    hibernate查询之后用el表达式取值时遇到的问题
    考研:操作系统:进程同步—信号量实现同步互斥(PV操作)
    考研:操作系统:处理机调度——几种经典的调度算法
    KMP算法
    mysql出现ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' 错误
  • 原文地址:https://www.cnblogs.com/Aa1039510121/p/6833480.html
Copyright © 2020-2023  润新知