每日AC

许诺  •  2个月前


#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

int dp[20][11]; int digit[20];
int len;
int dfs(int pos, int pre, bool flag) {

if (pos == len) {
    return 1; 
}
if (!flag && dp[pos][pre + 1] != -1) {
    return dp[pos][pre + 1];
}
int limit = flag ? digit[pos] : 9; 
int start = (pre == -1) ? 0 : pre; 
int ans = 0;
for (int d = start; d <= limit; ++d) {
    int new_pre;
    bool new_flag = flag && (d == digit[pos]);
    if (pre == -1) {
        new_pre = (d == 0) ? -1 : d;
    } else {
        new_pre = d;
    }
    ans += dfs(pos + 1, new_pre, new_flag);
}
if (!flag) {
    dp[pos][pre + 1] = ans;
}
return ans;

}

// 计算0到n的不降数个数 int f(int n) {

if (n < 0) return 0;
len = 0;
if (n == 0) {
    digit[len++] = 0;
} else {
    int temp = n;
    while (temp) {
        digit[len++] = temp % 10;
        temp /= 10;
    }
    reverse(digit, digit + len);
}
memset(dp, -1, sizeof(dp)); 
return dfs(0, -1, true);

}

int main() {

int a, b;
while (cin >> a >> b) {
    cout << f(b) - f(a - 1) << endl;
}
return 0;

}


评论:

请先登录,才能进行评论