题目来源:https://www.luogu.org/problemnew/show/P2657
简单的数位dp。
代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <set>
#define ll long long
#define ull unsigned long long
#define BUG cout<<"*************************"<<endl
using namespace std;
const ll mod = 1000000007;
const int maxn = 5e3 + 10;
const int maxm = 1e6 + 10000;
const double eps = 1e-8;
int a[100];
ll f[101][11];
ll dp(int len) {
if (len == 0)return 0;
ll ans = 1;
for (int i = 1; i < a[len]; ++i) {
ans += f[len][i];
}
for (int i = len - 1; i; --i) {
for (int j = 0; j < a[i]; ++j) {
if (abs(j - a[i + 1]) >= 2)ans += f[i][j];
}
if (abs(a[i] - a[i + 1]) < 2) {
ans--;
break;
}
}
for (int i = len - 1; i; --i) {
for (int j = 1; j <= 9; ++j) {
ans += f[i][j];
}
}
return ans;
}
ll solve(ll t) {
int pos = 0;
while (t) {
a[++pos] = (int) (t % 10);
t /= 10;
}
return dp(pos);
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
for (int i = 0; i <= 9; ++i)
f[1][i] = 1;
for (int i = 2; i <= 15; ++i) {
for (int j = 0; j <= 9; ++j) {
for (int k = 0; k <= 9; ++k) {
if (abs(j - k) >= 2) {
f[i][j] += f[i - 1][k];
}
}
}
}
ll a, b;
cin >> a >> b;
cout << solve(b) - solve(a - 1) << endl;
return 0;
}