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 }