题意:区间[a,b]中有多少个不含前导0且两个相邻数字之间最少相差2的正整数。
dp[site][x]:在第site位,前一个数字是x的情况下有多少个整数。需要注意的是...这个前导0的判断很重要...
ok代表的现在是否包含有前导0.
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
int dp[20][20],num[20];
int dfs(int site,int x,int f,int ok)
{
if(site==0)
return ok;
if(!f&&dp[site][x]!=-1&&ok)
return dp[site][x];
int len=f?num[site]:9;
int ans=0;
for(int i=0;i<=len;i++)
{
if(ok==0||abs(x-i)>=2)
ans+=dfs(site-1,i,f&&i==len,ok||i>0);
}
if(!f&&ok)
dp[site][x]=ans;
return ans;
}
int solve(int n)
{
int i=0;
while(n)
{
num[++i]=n%10;
n=n/10;
}
return dfs(i,11,1,0);
}
int main()
{
int a,b;
memset(dp,-1,sizeof(dp));
while(scanf("%d %d",&a,&b)!=EOF)
printf("%d\n",solve(b)-solve(a-1));
return 0;
}