题意:略
题解:略,挂一个洛谷日报关于数位dp的介绍
注意:此题记忆化搜索时数组不光要记录pos还要记录pre(上一位填的数),因为上一位填比如说1和2,对当前位的答案有影响(这一位可以填的数的个数不同)。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int l,r;
int a[10],tot;
int f[10][10];//pos, pre, lead, lim
inline int dfs(int pos,int pre,bool lead,bool lim) {
if (pos<0) return 1;
if (!lim&&!lead&&~f[pos][pre]) return f[pos][pre];
int ret=0;
int up=lim?a[pos]:9;
for (int i=0;i<=up;++i) {
if (!lead&&abs(i-pre)<2) continue;
ret+=dfs(pos-1,i,lead&&i==0,lim&&i==a[pos]);
}
if (!lim&&!lead) f[pos][pre]=ret;
return ret;
}
inline void init() {
memset(f,-1,sizeof(f));
tot=0;
}
inline int calc(int x) {
init();
while (x) {
a[tot++]=x%10;
x/=10;
}
return dfs(tot-1,0,true,true);
}
int main() {
scanf("%d%d",&l,&r);
printf("%d\n",calc(r)-calc(l-1));
return 0;
}