首先看了数位dp,刚看到这个名字,我没理解是什么意思,看了看资料,原来是与数字的位数与是否存在等有关,一般是求一个区间内符合某种关系的数字的个数,而通常与某些特定的数有关,比如资料中的第一题,不要62
这个题就是与数字位数上的数字有关,含有62和4的就是不吉利数字。
刚看到这个题我的思路就是分解每位数字到数组中,然后循环查找。然后呢,这样肯定会浪费许多的时间。
而数位dp是先将一个数的每位上的数分解到数组中,然后在通过深度优先搜索共同求符合条件的数,然后一步步往后推,相当于求出了从0到该数的符合条件的数的个数,而要求从a-b,就是分别求,然后两者所得的值相减,就是符合的区间的答案。
本想去hdu去提交,结果hdu居然也挂了,然后想到vj,vj居然能用,刷新了十几遍才进去vj,现在是不是只有vj能用了。。。。。
#include<iostream>
#include<string.h>
#include<stdio.h>
int dp[8][2],a[8];
int dfs(int len,bool state,bool fp)
{
int i;
if(!len)
return 1;
if(!fp&&dp[len][state]!=-1)
return dp[len][state];
int ret=0,fpmax=fp?a[len]:9;
for(i=0;i<=fpmax;i++)
{
if(i==4||state&&i==2)
continue;
ret+=dfs(len-1,i==6,fp&&i==fpmax);
}
if(!fp)
dp[len][state]=ret;
return ret;
}
int f(int n)
{
int len=0;
while(n)
{
a[++len]=n%10;
n/=10;
}
return dfs(len,false,true);
}
int main()
{
int n,m;
memset(dp,-1,sizeof(dp));
while(~scanf("%d%d",&n,&m),n||m)
printf("%d\n",f(m)-f(n-1));
return 0;
}