vijos p1848 计数问题 数位dp
描述
试计算在区间 1 到 n 的所有整数中,数字 x(0 ≤ x ≤ 9)共出现了多少次?例如,在 1 到 11 中,即在 1、2、3、4、5、6、7、8、9、10、11 中,数字 1 出现了 4 次。样例输入1
11 1
样例输出1
4提示
对于 100%的数据,1≤ n ≤ 1,000,000,0 ≤ x ≤ 9。思路
这道题的数据范围不大,可以直接枚举,当然数位dp更快,注意判断前导0即可。
用时
全部1ms
#include <bits/stdc++.h>
#define fu(a, b, c) for (int a = b; a <= c; a++)
#define fd(a, b, c) for (int a = b; a >= c; a--)
using namespace std;
int a[10], dp[10][10][2], n, q, cnt;
int dfs(int pos, int sta, int pre, int limit) {
if (pos == -1)
return sta;
if (!limit && dp[pos][sta][pre] != -1) {
return dp[pos][sta][pre];
}
int up = limit ? a[pos] : 9, tmp = 0;
fu(i, 0, up) {
int nsta = q || pre ? sta + (i == q) : sta;
tmp += dfs(pos - 1, nsta, i || pre, limit && i == a[pos]);
}
if (!limit)
dp[pos][sta][pre] = tmp;
return tmp;
}
int solve(int x) {
cnt = 0;
memset(dp, -1, sizeof dp);
while (x) {
a[cnt++] = x % 10;
x /= 10;
}
return dfs(cnt - 1, 0, 0, 1);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> q;
cout << solve(n) << '\n';
}

浙公网安备 33010602011771号