题解

xy0313 2020-09-30 9:11:06

数位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 条回复

Laffey

考古

Mrnobody

占个前排嘿嘿嘿

liurfly

前排资瓷