hdu 2089 不要62(初学数位DP)

http://acm.hdu.edu.cn/showproblem.php?pid=2089

题意:

给定 m,.n;

 

求车牌号 m~n之间 有多少数字 不含 4或62     ,8652是可以的 。

Sample Input
1 100 0 0
 

 

Sample Output
80

 

 1 #include <iostream>

 2 #include<stdio.h>

 3 #include<string.h>

 4 #define maxn   11

 5 int dp[maxn][11] ;

 6 using namespace std;

 7 void init()

 8 {

 9     int i,j,k;

10 

11     memset(dp,0,sizeof(dp));

12      dp[0][0] = 1 ;

13 

14     for(i = 1 ; i<= maxn ;i++)

15     {

16        for(j = 0;j <= 9;j++)

17        {

18 

19            for(k = 0 ; k<=9;k++)

20            {

21                 if(j != 4&&!(j== 6&&k == 2))dp[i][j] = dp[i][j] + dp[i - 1][k];

22 

23               //if(j == 6&&k!=2)dp[i][j] = dp[i][j] + dp[i - 1][k] ;

24            }

25 

26        }

27     }

28 

29 

30 

31 }

32 

33 int solve(int x)

34 {

35     int i,j ;

36     int a[maxn];

37     int len = 0;

38     while(x)

39     {

40         a[++len] = x%10;

41         x = x/10;

42     }

43 

44     int  ans = 0 ;

45 

46       a[++len] = 0;

47     for(i = len;i > 0;i--)

48     {

49 

50           for(j = 0 ; j < a[i];j++)

51           {

52 

53               if(j == 4||(a[i+1] == 6&&j == 2))continue ;

54 

55               ans+=dp[i][j] ;

56               //printf("%d %d\n",j,dp[i][j]);

57           }

58           if(a[i] == 4||(a[i+1] == 6&&a[i]==2))break;//这里忘记了 WA2次,只因为我们是从高位 到低位

59           

60           搞得,当有一位不符合,那么比其大的也不符合 如8456,当我们判断到4时,所有83**(这时我们已经计入了)都是,而84**就不在是了

61     }

62 

63     return ans ;

64 }

65 int main()

66 {

67    int n ,m;

68    init() ;

69 

70 

71 

72    while(scanf("%d%d",&n,&m)!=EOF)

73    {

74        if(n == 0 && m ==0)break;

75         printf("%d\n",solve(m+1) - solve(n));

76        //printf("%d\n",solve(m) - solve(n - 1));

77    }

78 }

 

你可能感兴趣的:(HDU)