【HDOJ】【3555】Bomb
数位DP
cxlove基础数位DP第二题
与上题基本相同(其实除了变成long long以外其实更简单了……)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //HDOJ 3555 2 #include<cmath> 3 #include<vector> 4 #include<cstdio> 5 #include<cstring> 6 #include<cstdlib> 7 #include<iostream> 8 #include<algorithm> 9 #define rep(i,n) for(int i=0;i<n;++i) 10 #define F(i,j,n) for(int i=j;i<=n;++i) 11 #define D(i,j,n) for(int i=j;i>=n;--i) 12 #define pb push_back 13 using namespace std; 14 int getint(){ 15 int v=0,sign=1; char ch=getchar(); 16 while(!isdigit(ch)) {if(ch=='-') sign=-1; ch=getchar();} 17 while(isdigit(ch)) {v=v*10+ch-'0'; ch=getchar();} 18 return v*sign; 19 } 20 const int N=1e7+10,INF=~0u>>2; 21 const double eps=1e-8; 22 typedef long long LL; 23 /*******************template********************/ 24 LL dp[25][3]; 25 LL len,bit[25]; 26 //dp[i][0]表示不含49的i位数字 27 //dp[i][1]表示不含49,且最高位为9 28 //dp[i][2]表示存在49 29 void init(){ 30 dp[0][0]=1; 31 F(i,1,20){ 32 dp[i][0]=(LL)dp[i-1][0]*10-dp[i-1][1]; 33 dp[i][1]=dp[i-1][0]; 34 dp[i][2]=(LL)dp[i-1][2]*10+dp[i-1][1]; 35 } 36 } 37 LL solve(LL n){ 38 len=0; n++; 39 for(;n;n/=10) bit[++len]=n%10; 40 bit[len+1]=0; 41 printf("check : "); 42 D(i,len,1) printf("%lld",bit[i]); 43 printf("\n"); 44 LL ans=0; 45 bool flag=false; 46 D(i,len,1){ 47 ans+=(LL)dp[i-1][2]*bit[i]; 48 if (flag) ans+=(LL)dp[i-1][0]*bit[i]; 49 if (!flag && bit[i]>4) ans+=dp[i-1][1]; 50 if (bit[i+1]==4 && bit[i]==9) flag=true; 51 } 52 return ans; 53 } 54 int main(){ 55 init(); 56 int T;LL n; 57 for(T=getint();T;T--){ 58 scanf("%I64d",&n); 59 printf("%I64d\n",solve(n)); 60 } 61 return 0; 62 }