许诺 • 21天前
#include <bits/stdc++.h>
using namespace std;
int dp[20][10][2][2];
string num;
int dfs(int pos, int prev, bool leading, bool tight) {
if (pos == num.size()) {
return 1;
}
if (dp[pos][prev][leading][tight] != -1) {
return dp[pos][prev][leading][tight];
}
int limit = tight ? num[pos] - '0' : 9;
int ans = 0;
for (int i = 0; i <= limit; ++i) {
if (leading && i == 0) {
ans += dfs(pos + 1, i, true, tight && (i == limit));
} else {
if (abs(i - prev) >= 2 || leading) {
ans += dfs(pos + 1, i, false, tight && (i == limit));
}
}
}
return dp[pos][prev][leading][tight] = ans;
}
int countWindy(int x) {
num = to_string(x);
memset(dp, -1, sizeof(dp));
return dfs(0, 0, true, true);
}
int main() {
int A, B;
cin >> A >> B;
int ans = countWindy(B) - countWindy(A - 1);
cout << ans << endl;
return 0;
}
评论:
请先登录,才能进行评论