看题目很容易想到数位dp,具体做法看这位的:http://blog.csdn.net/zz_ylolita/article/details/50754618
讲的还是很详细的。
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;
ll a,b;
int len,d[12];
ll dp[12][12];
ll work(ll x)
{
register int i,j;
ll re=0;
if (x==0) return 0;
len=0,memset(d,0,sizeof(d));
while (x>0)
{
d[++len]=x%10;
x/=10;
}
for (i=1;i<=d[len]-1;i++)
{
re+=dp[len][i];
}
for (i=len-1;i>0;i--)
for (j=1;j<=9;j++)
{
re+=dp[i][j];
}
for (i=len-1;i>0;i--)
{
for (j=0;j<=d[i]-1;j++)
{
if (abs(d[i+1]-j)>=2) re+=dp[i][j];
}
if (abs(d[i+1]-d[i])<2) break;
}
return re;
}
int main()
{
register int i,j,k;
scanf("%lld %lld",&a,&b);
for (i=0;i<=9;i++) dp[1][i]=1;
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];
}
printf("%lld\n",work(b+1)-work(a));
return 0;
}