题目描述
windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,
在A和B之间,包括A和B,总共有多少个windy数?
输入输出格式
输入格式:
包含两个整数,A B。
输出格式:
一个整数
输入输出样例
输入样例#1: 复制
1 10
输出样例#1: 复制
9
输入样例#2: 复制
25 50
输出样例#2: 复制
20
说明
100%的数据,满足 1 <= A <= B <= 2000000000 。
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
int dp[30][20];
int a[100];
int pos, l, r, t;
int dfs(int pos, int pre, bool lead, bool limit) {
if (pos == -1) return 1;
if (!limit && !lead && dp[pos][pre] != -1) return dp[pos][pre];
int up = limit ? a[pos]: 9;
int ans = 0;
for (int i = 0; i <= up; i++) {
if (abs(i - pre) < 2) continue;
if (lead && i == 0) {
ans += dfs(pos - 1, -2, true, limit && i == a[pos]);
}
else ans += dfs(pos - 1, i, false, limit && i == a[pos]);
}
if (!limit && !lead) dp[pos][pre] = ans;
return ans;
}
int solve(int x) {
pos = 0;
while (x) {
a[pos++] = x % 10;
x /= 10;
}
return dfs(pos - 1, -2, true ,true);
}
int main() {
memset(dp, -1, sizeof(dp));
cin >> l >> r;
cout << solve(r) - solve(l - 1) << endl;
return 0;
}