Hdu3555---数位dp
Posted pandaking
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hdu3555---数位dp相关的知识,希望对你有一定的参考价值。
这道题是hdu 3652的简单版本,它的容易之处在于hdu3652在求值的时候要保留其%13的余数,这道题不用!
1 #include<bits/stdc++.h> 2 typedef long long LL; 3 using namespace std; 4 int t; 5 LL n; 6 LL dp[20][3]; // 上一步为0, 7 int bit[20]; 8 9 10 LL dfs(int pos,int have,int lim){ 11 if(pos<=0) return have==2; 12 if(!lim&&dp[pos][have]!=-1) return dp[pos][have]; 13 int num=lim?bit[pos]:9; 14 LL ans=0; 15 for(int i=0;i<=num;i++){ 16 int next_h=have; 17 if(have==1&&i!=4) next_h=0;//第一个和第二个的顺序不能搞错, 18 if(have==1&&i==9) next_h=2;//如果i==9放到第一位,就会被后面的i!=4给完全覆盖 19 if(have==0&&i==4) next_h=1; 20 ans+=dfs(pos-1,next_h,lim&&i==num); 21 } 22 if(!lim) dp[pos][have]=ans; 23 return ans; 24 } 25 26 LL solve(LL m){ 27 int len=0; 28 while(m>0){ 29 bit[++len]=m%10;m=m/10; 30 } 31 return dfs(len,0,1); 32 } 33 34 int main(){ 35 scanf("%d",&t); 36 memset(dp,-1,sizeof(dp)); 37 while(t--){ 38 scanf("%lld",&n); 39 printf("%lld ",solve(n)); 40 } 41 return 0; 42 }
以上是关于Hdu3555---数位dp的主要内容,如果未能解决你的问题,请参考以下文章