AcWing 算法提高课 数位DP
数位DP的一般形式是:
在[X,Y]区间内,找到满足某种性质的数的个数。
技巧1:两端区间变为一边区间,计算[0, X]和[0, Y]在相减
技巧2:以树的方式考虑,从高位到低位,考虑枚举的数的当前位小于还是等于Y的当前位。
AcWing 1081. 度的数量

#include<bits/stdc++.h> using namespace std; long long X, Y, K, B; long long C[35][35]; long long DP(long long num) { if (num == 0) return 0; vector<int> nums; while (num) { nums.push_back(num%B); num /= B; } int res = 0; int last = 0; for (int i = nums.size() - 1; i >= 0; i--) { int num = nums[i]; if (num)//num>0才能选取当前位小于num { res += C[i][K - last];////当前位选取0 if (num > 1)//当前位选取1,且num>1,故剩余可以直接计算 { if (K - last - 1 >= 0) res += C[i][K - last - 1]; break; } else { last++; if (last > K) break; } } if (i == 0 && last == K) res++; } return res; } int main() { for (int i = 0; i <= 34; i++) { for (int j = 0; j <= i; j++) { if (j == 0) C[i][j] = 1; else C[i][j] = C[i - 1][j] + C[i - 1][j - 1]; } } cin >> X >> Y >> K >> B; cout << DP(Y) - DP(X - 1) << endl; }
AcWing 338. 计数问题

#include<bits/stdc++.h> using namespace std; typedef long long LL; LL digit_count[10][2]; void Count(int num, int index) { if (num==0) { digit_count[0][index]++; return; } string nums = to_string(num); vector<int> last(10, 0); for (int i = 0; i < nums.size(); i++)//每一位 { int num = nums[i] - '0'; for (int j = 0; j < num; j++)//小于当前位 { LL cc = pow(10, nums.size() - i-1); for (int k = 0; k < 10; k++) { digit_count[k][index] += last[k] * cc; digit_count[k][index] += cc * (nums.size() - i - 1) / 10; } digit_count[j][index] += cc; if (i == 0 && j == 0)//第一位为0,则需要去除全部前导0 { while (cc) { digit_count[0][index] -= cc; cc /= 10; } digit_count[0][index]++;//加回0 } } last[num]++; } for (int k = 0; k < 10; k++) { digit_count[k][index] += last[k];//最后相等 } } void YD() { LL a, b; while (cin >> a >> b, a || b) { memset(digit_count, 0, sizeof(digit_count)); Count(max(a, b), 0); Count(min(a, b) - 1, 1); for (int i = 0; i < 10; i++) cout << digit_count[i][0] - digit_count[i][1] << ' '; cout << endl; } } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int T = 1; //cin >> T; while (T--) { YD(); } return 0; }
数字不含前导0的数位dp
https://www.cnblogs.com/ydUESTC/p/16395628.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!