hdu 2089 不要62--数位dp入门

不要62

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Problem Description
杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer)。
杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。
不吉利的数字为所有含有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

数位dp水题~

代码如下:

 #include "stdio.h"
#include "string.h" int dp[][]; //dp[i][j]表示i位数中最高位为j的答案的个数 void Init()
{
int i,j,k;
memset(dp,,sizeof(dp));
for(j=; j<=; ++j)
dp[][j] = ;
dp[][] = ;
for(i=; i<=; ++i)
{
for(j=; j<=; ++j)
{
if(j==) continue;
for(k=; k<=; ++k)
{
if(j==&&k==) continue;
dp[i][j] += dp[i-][k];
}
}
}
} int Ans(int x)
{
int i,k;
int p[];
for(i=; ; i++)
{
p[i] = x%;
x = x/;
if(x==) break;
}
p[i+] = ;
int ans = ;
for( ; i>=; i--) //从最高位向下统计
{
for(k=; k<p[i]; k++)
{
if(k== || (p[i+]== && k==)) continue; //不符合的情况跳过
ans += dp[i][k];
} if(p[i]== || (p[i]== && p[i+]==))
break;
if(i==)
ans += dp[i][k];
}
return ans;
} int main()
{
int n,m;
Init();
while(scanf("%d%d",&n,&m),n||m)
printf("%d\n",Ans(m)-Ans(n-));
return ;
}
上一篇:java项目调用kettleJob和Trans


下一篇:android开发遇到SDK无法访问谷歌而安装不了的情况