Windy 定义了一种 Windy 数:不含前导零且相邻两个数字之差至少为 2 的正整数被称为 Windy 数。
Windy 想知道,在 A 和 B 之间,包括 A 和 B,总共有多少个 Windy 数?
输入:
一行两个数,分别为 A,B;
输出
一个整数,表示答案;
#include<algorithm>
#include<string.h>
#include<iostream>
#include<stdio.h>
#include<string>
#include<math.h>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define emplace_back push_back
#define pb push_back
using namespace std;
typedef long long LL;
const int mod = 1e9 + 7;
const double eps = 1e-6;
const int inf = 0x3f3f3f3f;
const int N = 2e5 + 10;
int a[30];
int dp[20][15];
int dfs(int pos,int limit,int pre)
{
if(pos<0)
{
return 1;
}
if(!limit&&dp[pos][pre]!=-1)
{
return dp[pos][pre];
}
int up = limit ? a[pos] : 9;
int rel = 0;
for (int i = 0; i <= up;i++)
{
if(abs(pre-i)<2)
{
continue;
}
if(pre==11&&i==0)
{
rel += dfs(pos - 1, limit && i == a[pos], 11);
}
else
rel += dfs(pos - 1, limit && i == a[pos], i);
}
if(!limit)
{
dp[pos][pre] = rel;
}
return rel;
}
int solve(int x)
{
int tot = 0;
while(x)
{
a[tot++] = x % 10;
x /= 10;
}
return dfs(tot - 1, 1, 11);
}
int main()
{
int n, m;
scanf("%d%d", &n, &m);
memset(dp, -1, sizeof(dp));
printf("%d\n", solve(m) - solve(n - 1));
return 0;
}