码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 3555——Bomb

时间:2020-04-04 18:39:04      阅读:64      评论:0      收藏:0      [点我收藏+]

标签:acm   include   name   efi   mda   bit   href   code   show   

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\n",a+1-solve(a));
39     }
40     return 0;
41 }

 

HDU 3555——Bomb

标签:acm   include   name   efi   mda   bit   href   code   show   

原文地址:https://www.cnblogs.com/YangKun-/p/12633086.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!