HDU 3555——Bomb

Posted yangkun-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 3555——Bomb相关的知识,希望对你有一定的参考价值。

HDU 3555——Bomb

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=3555

题意:让你找找不大于n的数里有多少含‘49’,

我们发现,T很大,N很大,暴力指定不行,因为含不含‘49‘是每一位的性质,可以考虑数位dp,(况且这就是数位dp的模板形式啊喂),因为在模板的基础改的,所以找的是1-n有多少个数不含49,总数减一下就行

dp状态记为dp[当前是第几位][前一位是不是4],所以第二维开到2就够用啦

模板题,上代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 ll a[1000009];
 5 ll dp[20][2];
 6 ll dfs(ll pos,ll num,bool limit)///num为上一位是否是4
 7 {
 8     if(!limit&&dp[pos][num]!=-1) return dp[pos][num];
 9     if(pos==0) return 1;
10     ll up=limit?a[pos]:9;
11     ll res=0;
12     for(ll i=0;i<=up;i++)
13     {
14         if(i==9&&num) continue;
15         res+=dfs(pos-1,i==4,limit&&i==a[pos]);
16     }
17     if(!limit) dp[pos][num]=res;
18     return res;
19 }
20 ll solve(ll x)
21 {
22     ll pos=0;
23     while(x)
24     {
25         a[++pos]=x%10;
26         x/=10;
27     }
28     return dfs(pos,0,1);
29 }
30 int main()
31 {
32     memset(dp,-1,sizeof(dp));
33     ll a,t;
34     scanf("%lld",&t);
35     while(t--)
36     {
37         scanf("%lld",&a);
38         printf("%lld
",a+1-solve(a));
39     }
40     return 0;
41 }

 

以上是关于HDU 3555——Bomb的主要内容,如果未能解决你的问题,请参考以下文章

[HDU3555]Bomb

HDU 3555Bomb 数位DP

HDU 3555——Bomb

HDU 3555 Bomb

HDU3555 Bomb

HDU - 3555 - Bomb(数位DP)