数字计数 题目传送门 解题思路 用\(dp[i][j][k]\)来表示长度为\(i\)且以\(j\)为开头的数里\(k\)出现的次数. 则转移方程式为:\(dp[i][j][k] += \sum_{t=0}^{9} dp[i - 1][t][k]\),即在每个数前面放一个\(j\),但是对于放在前面的这个\(j\)我们还没有计算进去,所以有:\(dp[i][j][j] += 10^{i-1}\).注意此时计算的是有前导0的. 接下来见代码(其实是不知道怎么描述). 代码如下 #include <…
BZOJ原题链接 洛谷原题链接 又是套记搜模板的时候.. 对\(0\sim 9\)单独统计. 定义\(f[pos][sum]\),即枚举到第\(pos\)位,前面枚举的所有位上是当前要统计的数的个数之和为\(sum\). #include<cstdio> #include<cstring> using namespace std; typedef long long ll; const int N = 13; ll f[N][N]; int a[N], nw; inline ll…
题目链接:https://www.luogu.com.cn/problem/P2602 题目大意: 计算区间 \([L,R]\) 范围内 \(0 \sim 9\) 各出现了多少次? 解题思路: 使用 数位DP 进行求解. 定义一个结构体数组 \(f[pos][all0]\) 表示满足如下条件时 \(0 \sim 9\) 出现的次数: 当前所在数位为第 \(pos\) 位: \(all0\) 为 \(1\) 表示当前状态之前一直都是前置 \(0\) ,为 \(0\) 表示前面的数位上面出现过不为…
洛谷 第一次找规律A了一道紫题,写篇博客纪念一下. 这题很明显是数位dp,但是身为蒟蒻我不会呀,于是就像分块打表水过去. 数据范围是\(10^{12}\),我就\(10^6\)一百万一百万的打表. 于是我就发现了一些规律. 先献给大家一个打表程序吧- #include <bits/stdc++.h> using namespace std; int main() { long long l,r,cnt[10]={}; for (long long t=0;t<=999999;++t) {…
题目链接 \(Description\) 求\([l,r]\)中\(0,1,\cdots,9\)每个数字出现的次数(十进制表示). \(Solution\) 对每位分别DP.注意考虑前导0: 在最后统计时,把0的答案减掉对应位的即可,在第\(i\)位的前导0会产生额外的\(10^{i-1}\)个答案. #include <cstdio> #include <cstring> #include <algorithm> int Ans[10],A[10],f[10][10]…
题目大意:求区间$[l,r]$中数字$0\sim9$出现个数 题解:数位$DP$ 卡点:无 C++ Code: #include <cstdio> #include <iostream> struct node { long long s[10], sum; inline node() {for (register int i = 0; i < 10; i++) s[i] = 0; sum = 0;} inline node(int x) {for (register int…
很久以前就...但是一直咕咕咕 思路:数位$DP$ 提交:1次 题解:见代码 #include<cstdio> #include<iostream> #include<cstring> #define ll long long #define R register ll using namespace std; ll f[][],a,b; //f[l][sum]对应dfs中(因为只在!ul&&!ck的时候记忆化) ]; ll dfs(int l,bool…
题目描述 输入格式 输出格式 输入输出样例 输入样例 1 99 输出样例 9 20 20 20 20 20 20 20 20 20 说明/提示 数据规模与约定 分析 很裸的一道数位DP的板子 定义f[当前枚举到的数位][当前数位之前的答案][枚举的数字] 其它的套板子就可以了,要注意一下前缀0的判断 代码 #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #in…
白嫖的一道省选题...... 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 typedef long long LL; 6 int dig[15],pos; 7 LL dp[15][10][15],ans[2][10]; 8 9 LL dfs(int pos,int val,int cnt,bool lead,bool limit){ 10 if…
最近在写DP,今天把最近写的都放上来好了,,, 题意:给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 首先询问的是一个区间,显然是要分别求出1 ~ r ,1 ~ l的答案,然后相减得到最终答案 首先我们观察到,产生答案的区间是连续的,且可以被拆分, 也就是说0 ~ 987的贡献= 0 ~ 900 + 901 ~ 987的贡献, 同理,把位拆开也是等价的,所以我们可以单独计算每个位的贡献 这样讲可能有点不太清晰,举个例子吧 3872 我们先把它按数拆开来…