数位DP模板题,不多赘述了
#include <iostream>
#include <cmath>
using namespace std;
int f[12][12];
void init() {
for (int i = 0; i <= 9; i++) f[1][i] = 1;
for (int i = 2; i <= 10; 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];
}
int ask(int x) {
int a[12] = { 0 };
int l = 0;
int ans = 0;
while (x) {
a[++l] = x % 10;
x /= 10;
}
for (int i = 1; i < l; i++)
for (int j = 1; j <= 9; j++) ans += f[i][j];
for (int i = 1; i < a[l]; i++) ans += f[l][i];
for (int i = l - 1; i >= 1; 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)
break;
}
return ans;
}
int main() {
init();
int x, y;
cin >> x >> y;
cout << ask(y + 1) - ask(x);
return 0;
}
共 3 条回复
考古
占个前排嘿嘿嘿
前排资瓷