数位DP 有一些细节要注意。。
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <cstring>
#include <cmath>
using namespace std;
int a[15];
long long dp[13][11], sum[13];
void init()
{
int i, j, k;
memset(dp,0,sizeof(dp));
memset(sum,0,sizeof(sum));
for(i=0;i<=9;i++)
dp[1][i]=1;
sum[1]=0;
for(i=2;i<=10;i++){
for(j=0;j<=9;j++)
for(k=0;k<=9;k++)
if(abs(j-k)>=2)
dp[i][j]+=dp[i-1][k];
for(j=1;j<=9;j++)
sum[i]+=dp[i-1][j];
sum[i]+=sum[i-1];
}
}
long long f(long long t)
{
int i, j, l=1;
while(t)
{
a[l++]=t%10;
t/=10;
}
l--;
long long ans=sum[l];
for(j=a[l]-1;j>0;j--)
ans+=dp[l][j];
for(i=l-1;i>0;i--){
if((l-i>=2)&&abs(a[i+2]-a[i+1])<2) break;
for(j=a[i]-1;j>=0;j--)
if(abs(j-a[i+1])>=2)
ans+=dp[i][j];
}
return ans;
}
int main()
{
long long x, y;
init();
while(~scanf("%lld%lld",&x,&y)){
printf("%lld\n",f(y+1)-f(x));
}
return 0;
}