windy数,相邻数字相差大于等于2.
#include <iostream>
#include <cstring>
#include <cmath>
using namespacestd;
int bits[12];
int dp[12][10][2];
int dfs(int len,int pre,bool lead,bool border)//第len个数,前一个数为pre,是否有前导0,是否在边界
{
if(!len)return 1;
if(!border &&dp[len][pre][lead] != -1 )return dp[len][pre][lead];
int res =0,up = border ? bits[len] :9;
for (int i =0; i <= up; i ++) {
if(lead || ((i - pre >=2) || (i - pre) <= -2))
res += dfs(len -1, i,lead && (i == 0), border && (i == up));
}
if(!border)dp[len][pre][lead] = res;
return res;
}
int f(int x)
{
int len =0;
while (x) {
bits[++len] = x %10;//数位从1存到n
x /= 10;
}
returndfs(len,0,1,1);//一开始是有前导0的
}
int main()
{
memset(dp, -1,sizeof(dp));
int a,b;
cin >> a >> b;
cout <<f(b) - f(a -1) << endl;
return0;
}