题解
一道数位dp入门题,预处理出f[i][j]表示第i位首位数字位j的方案数。
代码
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#define ll long long
using namespace std;
ll f[15][15],l,r,ToT;
int a[15];
void init()
{
for (int i=0;i<=9;i++) f[1][i]=1;
for (int i=2;i<=10;i++)
for (int j=0;j<=9;j++)
for (int k=0;k<=9;k++)
if (abs(j-k)>=2) f[i][j]+=f[i-1][k];
}
void divide(ll x){for (;x;x/=10) a[++ToT]=x%10;}
ll solve(ll x)
{
ll ret=0;
ToT=0,memset(a,0,sizeof(a));
divide(x);
for (int i=1;i<ToT;i++)
for (int j=1;j<=9;j++) ret+=f[i][j];
for (int i=1;i<a[ToT];i++) ret+=f[ToT][i];
for (int i=ToT-1;i>=1;i--)
{
for (int j=0;j<a[i];j++) if (abs(j-a[i+1])>=2) ret+=f[i][j];
if (abs(a[i]-a[i+1])<2) break;
if (i==1) ret++;
}
return ret;
}
int main()
{
init();
scanf("%lld%lld",&l,&r);
printf("%lld\n",solve(r)-solve(l-1));
return 0;
}