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
2010 ACM-ICPC Multi-University Training Contest(12)——Host by WHU
 

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\n",dfs(len- 1, 0, 1));
    }
     return  0;
}
* This source code was highlighted by YcdoiT. ( style: Codeblocks )

你可能感兴趣的:(HDOJ 3555 Bomb)