洛谷 P2657 [SCOI2009] windy 数

数位DP模板题

#include<bits/stdc++.h>
using namespace std;
const int N = 20;
int a[N];
int f[N][10];

inline int read() {
    int ans = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9') {
        if (ch == '-')f = -1;
        ch = getchar();
    }
    while (ch <= '9' && ch >= '0') {
        ans = ans * 10 + ch - '0';
        ch = getchar();
    }
    return ans * f;
}
void init() {
    for (int i = 0; i<= 9 ; i++) {
        f[1][i] = 1;
    }
    for (int i = 2; i< N; i++) {
        for (int j = 0; j< 10; j++) {
            for (int k= 0; k<10; k++) {
                if (abs(k-j)>=2)
                    f[i][j] += f[i-1][k];
            }
        }
    }
}
int dp(int x) {
    int cnt =0;
    while(x) {
       a[++cnt] = x%10;
        x/=10;
    }
    int ans = 0;
    int last = -2;
    for (int i = cnt; i>0; i--) {
        int cur = a[i];
        for (int j = i==cnt;j<cur;j++) {
            if (abs(j-last) >=2)
                ans += f[i][j];
        }
        if (abs(last - cur) <2)
            break;
        last = cur;
        if (i==1)
            ans++;
    }
    for (int i = 1; i< cnt; i++) {
        for (int j =1; j<10; j++) {
            ans += f[i][j];
        }
    }
    return ans;
}
int main() {
    init();
    int x= read(),y =read();
    cout<<dp(y)-dp(x-1);
    return 0;
}
posted @ 2025-03-19 20:37  Guaninf  阅读(13)  评论(0)    收藏  举报