数位dp,适用于解决一类求x~y之间有多少个符合要求的数或者其他. 例题 题目描述 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众. 不吉利的数字为所有含有4或62的号码.例如: 62315 73418 88914 都属于不吉利号码.但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列. 你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多少…
题目链接:https://www.luogu.com.cn/problem/P2602 题目大意: 计算区间 \([L,R]\) 范围内 \(0 \sim 9\) 各出现了多少次? 解题思路: 使用 数位DP 进行求解. 定义一个结构体数组 \(f[pos][all0]\) 表示满足如下条件时 \(0 \sim 9\) 出现的次数: 当前所在数位为第 \(pos\) 位: \(all0\) 为 \(1\) 表示当前状态之前一直都是前置 \(0\) ,为 \(0\) 表示前面的数位上面出现过不为…
序 天堂在左,战士向右 引言 数位DP在竞赛中的出现几率极低,但是如果不会数位DP,一旦考到就只能暴力骗分. 以下是数位DP详解,涉及到的例题有: [HDU2089]不要62 [HDU3652]B-number 概述 首先我们要理清的是,到底数位DP是什么. 事实上,一般数位DP的题目题面描述都会有以下内容: 求出一段区间\([l,r]\)中,满足某一特殊条件的数有多少个 在例题1 不要62中,特殊条件是数中不能出现"62":在例题2 B-number中,特殊条件是数中出现了13且该数…
P2602 [ZJOI2010]数字计数 题解 DFS 恶心的数位DP 对于这道题,我们可以一个数字一个数字的求 也就是分别统计区间 [ L , R ] 内部数字 i 出现的次数 (0<=i<=9) 也就是DFS只需要记录 : 当前填到第几位 pos k一共出现多少次 sum 目标数字 k 是否顶上界 limit 是否全是前导零 qdl dp[pos][sum]: >不顶上界,没有前导零, 当前填到第pos位,目标数字一共出现sum次的时候(前pos位中一共有sum个目标数字) 对答案产…
P2602 [ZJOI2010]数字计数 思路: 首先考虑含有前导0的情况,可以发现在相同的\(i\)位数中,每个数的出现次数都是相等的.所以我们可以设\(f(i)\)为\(i\)位数每个数的出现次数. 那么就有递推方程:\(f(i)=f(i-1)*10+10^{i-1}\). 假设现在要求的数为\(x\)位,那么我们依次从\(x\)位往下面求就行了.假设第\(x\)位的数字为\(k\),那么我们枚举第一位从\(0\)到\(k\),每一个数字的出现次数加上\(f(i-1)*k+10^{i-1}\…
很久以前就...但是一直咕咕咕 思路:数位$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…
数字计数 题目传送门 解题思路 用\(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 <…
转载请注明出处:http://blog.csdn.net/a1dark 分析:初学数位DP完全搞不懂.很多时候都是自己花大量时间去找规律.记得上次网络赛有道数位DP.硬是找规律给A了.那时候完全不知数位DP为何物.不过还是有很多时候要用数位DP.比如当一个数字超过了数组承受的极限.不能再打表AC.先看这道题.首先划分状态.然后初始化.最后从高位向低位状态转移.代码含详解 //dp[len][0]表示长度为len不含49的数量 //dp[len][1]表示长度为len不含44但以9开头的数字的数量…
算法使用范围 在一个区间里面求有多少个满足题目所给的约束条件的数,约束条件必须与数自身的属性有关 下面用kuangbin数位dp的题来介绍 例题  不要62 题意:在一个区间里面求出有多少个不含4和62的数 做法:平常我们的做法肯定是从L枚举到R,然后数位上一个一个的判断,但是如果是范围过大的话我们不可以预处理存储,只能每次去枚举,这样肯定会超时 所以我们使用数位DP 记忆化搜索,我们dfs去枚举每一位 数位部分 例如 2567 因为千位是2的时候我的百位只能从0-5,1的时候百位却是可以0-9…
https://www.luogu.org/problemnew/show/P2602 数位dp #include <bits/stdc++.h> using namespace std; #define ll long long ; ll g[],shi[]; void cal(ll a,ll c,int ori) { int i,w,s; w=(log(a+minv)/log()); i=w; ) g[]-=shi[i--]*c; ) { s=a/shi[w]; ) ;i<;i++)…