数位DP经典题..
最后写完挺短,然而为什么感觉这么难写…再次证明了本蒟蒻是有多么若…
AC code:
#include <cstdio>
const int N=15;
int a[3],len[3],ans[3];
int b[3][N],f[N][10];
int Abs(int x){
return x<0?-x:x;
}
void cal(int num,int x,int last){
if(x==len[num]){
ans[num]++;
for(int i=x-1;i>=1;i--){
for(int j=1;j<10;j++) ans[num]+=f[i][j];
}
}
for(int i=(x==len[num]?1:0);i<b[num][x];i++){
if(x!=len[num]&&Abs(i-last)<2) continue;
ans[num]+=f[x][i];
}
if(x==1){
if(len[num]==1||Abs(b[num][x]-last)>=2) ans[num]++;
return ;
}
if(x==len[num]||Abs(b[num][x]-last)>=2) cal(num,x-1,b[num][x]);
}
int main(){
scanf("%d%d",&a[1],&a[2]);
a[1]--;
for(int i=1;i<=2;i++){
int t=a[i];
if(!t){
len[i]=1;
continue;
}
while(t){
b[i][++len[i]]=t%10;
t/=10;
}
}
for(int i=0;i<10;i++) f[1][i]=1;
for(int i=2;i<=len[2];i++){
for(int j=0;j<10;j++){
for(int k=j-2;k>=0;k--) f[i][j]+=f[i-1][k];
for(int k=j+2;k<10;k++) f[i][j]+=f[i-1][k];
}
}
for(int i=1;i<=2;i++) cal(i,len[i],233);
if(!a[1]) ans[1]=1;
printf("%d\n",ans[2]-ans[1]);
return 0;
}