[HDU 2089] 不要62

dp[dep][six]表示长度为dep的,上一位是否为6的不含62,不含4的数的个数

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int dp[10][2],dig[10];
 4 int dfs(int dep,int six,int flag){
 5     if(!dep)return 1;
 6     if(!flag&&dp[dep][six]!=-1)return dp[dep][six];
 7     int lim=flag?dig[dep]:9;
 8     int ans=0;
 9     for(int i=0;i<=lim;i++){
10         if((six&&i==2)||i==4)continue;
11         ans+=dfs(dep-1,i==6?1:0,flag&(i==lim));
12     }
13     if(!flag)dp[dep][six]=ans;
14     return ans;
15 }
16 int solve(int x){
17     int dd=0;
18     while(x)dig[++dd]=x%10,x/=10;
19     return dfs(dd,0,1);
20 }
21 int main(){
22     memset(dp,-1,sizeof(dp));
23     int A,B;
24     while(1){
25         scanf("%d%d",&A,&B);
26         if(!A&&!B)break;
27         printf("%d\n",solve(B)-solve(A-1));
28     }
29     return 0;
30 }
View Code

 

posted @ 2016-05-11 19:13  Ngshily  阅读(124)  评论(0编辑  收藏  举报