以前觉得特别难不敢看跳过的题目现在居然自己一发AC
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 15;
int len;
int nums[N], f[N][N];
int dfs(int pos, int cnt, int k, int lead, int limit) {
if (!pos) return cnt;
if (!limit && !lead && ~f[pos][cnt]) return f[pos][cnt]; // 若知道从当前状态往下层搜索有多少的方案,记忆化
int up = limit ? nums[pos] : 9, res = 0;
for (int i = 0; i <= up; i ++ ) {
if (!k)
res += dfs(pos - 1, cnt + (!lead && !i), k, lead && !i, limit && i == up);
else
res += dfs(pos - 1, cnt + (i == k), k, lead && !i, limit && i == up);
}
return limit ? res : (lead ? res : f[pos][cnt] = res);
}
int calc(int x, int k) {
len = 0;
memset(f, -1, sizeof f);
while (x) nums[ ++ len] = x % 10, x /= 10;
return dfs(len, 0, k, 1, 1);
}
int main() {
int l, r;
while (cin >> l >> r, l || r) {
if (l > r) swap(l, r);
for (int i = 0; i <= 9; i ++ )
cout << calc(r, i) - calc(l - 1, i) << ' ';
cout << endl;
}
return 0;
}
lih
blh