题目
不含前导零且相邻两个数字之差至少为2的正整数被称为windywindywindy数。在AAA和BBB之间,包括AAA和BBB,总共有多少个windywindywindy数?
分析
这又是一道数位dp的题目,首先要考虑该位是否限制以及前导0,然后记忆化也是必要的,枚举的数绝对值要比上一个超出2,但是如果前面是0的话,那么就把它留着,因为0还很有用。
代码
#include <cstdio>
#include <cstring>
#include <cmath>
#define rr register
using namespace std;
int dp[17][17],dig[17],l,r;
inline signed dfs(int dep,int ls,bool lim,bool qdl){
if (!dep) return 1;
if (!qdl&&!lim&&dp[dep][ls]!=-1) return dp[dep][ls];
rr int ans=0,mx=lim?dig[dep]:9;
for (rr int i=0,now;i<=mx;++i){
if (abs(i-ls)<2) continue;
now=i; if (qdl&&i==0) now=-7;
ans+=dfs(dep-1,now,lim&&(i==mx),now==-7);
}
if (!lim&&!qdl) dp[dep][ls]=ans;
return ans;
}
inline signed answ(int x){
rr int len=0;
while (x) dig[++len]=x%10,x/=10;
memset(dp,-1,sizeof(dp));
return dfs(len,-7,1,1);
}
signed main(){
scanf("%d%d",&l,&r);
printf("%d",answ(r)-answ(l-1));
return 0;
}