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


    数位DP的DFS写法。。。。

    Bomb

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


    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
     

    Recommend
    zhouzeyong
     
     


    #include <iostream>
    #include <cstdio>
    #include <cstring>

    using namespace std;

    typedef long long int LL;

    int bit[30];
    LL dp[25][3];

    LL dfs(int pos,int s,bool limit)
    {
        if(pos==-1)
            return s==2;
        if(limit==false&&~dp[pos][s])
            return dp[pos][s];
        int end=limit?bit[pos]:9;
        LL ans=0;
        for(int i=0;i<=end;i++)
        {
            int news=s;
            if(s==0&&i==4) news=1;
            if(s==1&&i!=9) news=0;
            if(s==1&&i==9) news=2;
            if(s==1&&i==4) news=1;
            ans+=dfs(pos-1,news,limit&&i==end);
        }
        if(!limit)
            return dp[pos][s]=ans;
        else
            return ans;
    }

    int main()
    {
        LL n;
        int T;
        memset(dp,-1,sizeof(dp));
        scanf("%d",&T);
        while(T--)
        {
            scanf("%I64d",&n);
            int len=0;
            while(n)
            {
                bit[len++]=n%10;
                n/=10;
            }
            printf("%I64d ",dfs(len-1,0,1));
        }
        return 0;
    }
    * This source code was highlighted by YcdoiT. ( style: Codeblocks )

  • 相关阅读:
    直道相思了无益 你既无心我便休
    c#与XML
    ASP.NET读取Excel文件的三大方法浅析
    当前标识(NT AUTHORITY\NETWORK SERVICE)没有对“C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files”的写访问权限。
    比较这2段HTML代码
    编码的一点思维
    代码修改的一个范例
    在aspx.cs中不出现中文?
    规则先行
    设计模式——UML简介
  • 原文地址:https://www.cnblogs.com/CKboss/p/3350848.html
Copyright © 2011-2022 走看看