hdu 2089 不要62 数位DP

思路:

dp[i][0]:位数<=i且不含不吉利数字的个数;

dp[i][1]:位数<=i且含6的个数。

代码如下:

 1 #include<cstdio>

 2 #include<cstring>

 3 int bit[6],dp[6][3];

 4 int dfs(int pos,int h,bool f)

 5 {

 6     if(pos==-1) return 1;

 7     if(!f&&dp[pos][h]!=-1) return dp[pos][h];

 8     int ans=0;

 9     int e=f?bit[pos]:9;

10     for(int i=0;i<=e;i++){

11         if(i==4||(h==1&&i==2)) continue;

12         ans+=dfs(pos-1,i==6,f&&(i==bit[pos]));

13     }

14     if(!f) dp[pos][h]=ans;

15     return ans;

16 }

17 int cal(int n)

18 {

19     int m=0;

20     while(n){

21         bit[m++]=n%10;

22         n/=10;

23     }

24     return dfs(m-1,0,1);

25 }

26 int main()

27 {

28     int n,m;

29     memset(dp,-1,sizeof(dp));

30     while(scanf("%d%d",&n,&m)&&(n+m)){

31         printf("%d\n",cal(m)-cal(n-1));

32     }

33 }
View Code

 

 

 

你可能感兴趣的:(HDU)