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 }

 

posted @ 2014-03-10 22:01  Szz  阅读(231)  评论(0编辑  收藏  举报