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的主要内容,如果未能解决你的问题,请参考以下文章