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
#include <iostream>
#include<stdio.h>
#include<string.h>
#define maxn 11
int dp[maxn][] ;
using namespace std;
void init()
{
int i,j,k; memset(dp,,sizeof(dp));
dp[][] = ; for(i = ; i<= maxn ;i++)
{
for(j = ;j <= ;j++)
{ for(k = ; k<=;k++)
{
if(j != &&!(j== &&k == ))dp[i][j] = dp[i][j] + dp[i - ][k]; //if(j == 6&&k!=2)dp[i][j] = dp[i][j] + dp[i - 1][k] ;
} }
} } int solve(int x)
{
int i,j ;
int a[maxn];
int len = ;
while(x)
{
a[++len] = x%;
x = x/;
} int ans = ; a[++len] = ;
for(i = len;i > ;i--)
{ for(j = ; j < a[i];j++)
{ if(j == ||(a[i+] == &&j == ))continue ; ans+=dp[i][j] ;
//printf("%d %d\n",j,dp[i][j]);
}
if(a[i] == ||(a[i+] == &&a[i]==))break;//这里忘记了 WA2次,只因为我们是从高位 到低位 搞得,当有一位不符合,那么比其大的也不符合 如8456,当我们判断到4时,所有83**(这时我们已经计入了)都是,而84**就不在是了
} return ans ;
}
int main()
{
int n ,m;
init() ; while(scanf("%d%d",&n,&m)!=EOF)
{
if(n == && m ==)break;
printf("%d\n",solve(m+) - solve(n));
//printf("%d\n",solve(m) - solve(n - 1));
}
}