2089 不要62 数位dp-1
Problem Description
杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer)。
杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。
不吉利的数字为所有含有4或62的号码。例如:
62315 73418 88914
都属于不吉利号码。但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列。
你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多少辆新的士车上牌照了。
杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。
不吉利的数字为所有含有4或62的号码。例如:
62315 73418 88914
都属于不吉利号码。但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列。
你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多少辆新的士车上牌照了。
Input
输入的都是整数对n、m(0<n≤m<1000000),如果遇到都是0的整数对,则输入结束。
Output
对于每个整数对,输出一个不含有不吉利数字的统计个数,该数值占一行位置。
Sample Input
1 100
0 0
Sample Output
80
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<algorithm> 5 #include<cmath> 6 #include<cstring> 7 #include<stack> 8 #include<queue> 9 #include<map> 10 #include<set> 11 using namespace std; 12 int f[10][10]; 13 int cal(int n) 14 { 15 int len=0,num[10],sum=0,i,j; 16 num[0]=0; 17 while(n)//分离出位数和该位数上的数 18 { 19 num[len]=n%10; 20 len++; 21 n=n/10; 22 } 23 num[len]=0; 24 for(i=len-1;i>=0;i--) 25 { 26 for(j=0;j<num[i];j++) 27 { 28 if(j!=4&&!(j==2&&num[i+1]==6))//注意是两个(&&)而不是(||)和(&&) 29 sum=sum+f[i+1][j];//不同位上不同数字进行求和 30 } 31 if(num[i]==4||(num[i+1]==6&&num[i]==2))//如果其中一个位数上的为4或者62的话这个车牌就不能用,所以跳出了 32 break; 33 } 34 return sum; 35 } 36 int main() 37 { 38 int n,m,i,j,k; 39 memset(f,0,sizeof(f)); 40 f[0][0]=1; 41 for(i=1;i<=7;i++)//打表,初始化第i位上数字j其余位上都是0有多少个车牌数 42 { 43 for(j=0;j<=9;j++) 44 { 45 for(k=0;k<=9;k++) 46 { 47 if(j!=4&&!(j==6&&k==2)) 48 f[i][j]+=f[i-1][k]; 49 } 50 } 51 } 52 while(cin>>n>>m&&(n||m)) 53 { 54 cout<<cal(m+1)-cal(n)<<endl; 55 } 56 return 0; 57 }
第一次接触数位dp,代码虽然不是自己想出来的,但也明白了是怎么回事