-
-
Notifications
You must be signed in to change notification settings - Fork 3.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
add 数位DP #2440
Comments
感谢你对 OI Wiki 的关注!记得在 Issue 中表达清楚自己的意思哦~ |
ping.
能不能更简明地说明一下要添加的内容呢? |
看了半天,内容大致上确实已经有了 https://oi-wiki.org/dp/number/ 鸣谢中也给出了本文。 本文的5道题:
本issue的5道题:
其中,Light OJ的题目与Luogu P2602一致,Luogu P2602是它的超集。这几个题里面似乎只有SPOJ BALNUM有可能写进数位DP页面中,然而本issue写的很是缺乏分析过程。 综上,不认为这是一个需要对数位DP页面进行有效改进的issue。
|
看了半天,内容大致上确实已经有了 https://oi-wiki.org/dp/number/ 鸣谢中也给出了本文。 本文的5道题:
本issue的5道题:
其中,Light OJ的题目与Luogu P2602一致,Luogu P2602是它的超集。这几个题里面似乎只有SPOJ BALNUM有可能写进数位DP页面中,然而本issue写的很是缺乏分析过程。 综上,不认为这是一个需要对数位DP页面进行有效改进的issue。
|
我遇到的问题是
内容不是很丰富,不能详细讲解内容
我希望能有这样的解决方案
浅谈数位DP
1. 引言
awa最近在康数位DP。7月21日的时候,周老师考虑(仅仅是考虑)让我分享一下自己的
人生经验。所以不管最后有没有上去讲,写就完了。到时候不知道能不能用树莓派讲题awa2. 我完成的题目
由于我做题的顺序和难度显然没有直接关联,所以我用表格记录一下qwq
3. 啥叫数位DP?
数位DP通常是求:给定一个闭区间 ,让你求这个区间中满足某种条件的数的总数。
4.例题!
4.1. Light OJ 1140
题意
求:假如手写下$[n,m]$之间所有整数,会写下多少个0?
做法
首先转化:$[n,m]$之间的0的个数=$[1,m]$之间的0的个数$-$$[1,n-1]$ 之间的0的个数
考虑从高位开始枚举,枚举当前位,最后统计。我们设当前位为第now位。
我们发现,如果递归到达终点,影响计数的只有0的个数而非0的位置。所以我们用一个值记录下当前位及之前的位含有的0的个数。(cnt)
我们发现,如果当前位之前的位(前now-1位)和上限的前now-1位一模一样的时候,当前位(即第now位)只能填写$[0,上限第now位数字]$之间的数字。所以用一个值判断一下。(ok)
我们发现,如果当前位及之前的位(前now位)都是0(即全前导0)的时候,这些0是不应该被计入的。所以用一个值判断一下。(pre)
考虑使用DFS实现算法,从下一位的子状态中转移而来。子状态的要素有:当前处于第now位,前now位中有cnt个0,以及是否全顶格和是否全前导零的判断(分别为ok,pre)
需要特别注意的是,如果是发现到达递归终点的时候,仍然为全前导0(也就是0),应当记为1个0,否则递归到上一层的时候会认为两位数结尾的0不存在。
为达到更高的效率,我们把前now位中出现cnt个0且既不全前导0,也不全顶格的情况使用$f[now][cnt]$ 记录下来,以节约时间。
4.2. HDU 2089
题意
求:假如手写下$[n,m]$之间所有整数,会有多少数不含有数字4或者连续的62?
做法
考虑dfs求解的时候,记录当前位数字是什么,枚举下一位的数字是什么。如果下一位是4,直接continue;如果当前位是6,并且下一位是2,也continue。
4.3. HDU 3555
与HDU 2089(4.2.)类似,故跳过。
4.4. SPOJ BALNUM
题意
我们认为:如果一个n位数字被拆分成n个1位数字,出现的任何奇数都有偶数个、任何偶数都有奇数个,则称该数为“平衡数”。
此数非彼树求:$[n,m]$之间的所有整数中,有多少“平衡数”?
解法:
事先声明,我写的比较飘逸,在考场上不建议大家这么玩。
我就是吃饱了没事儿干考虑:在递归时带着当前位,是否全0,是否全顶格以及(每一位是没出现过,还是出现了奇数次,还是赤县了偶数次)的值,一路狂飚。
4.5. SPOJ MYQ10
题意
求:假如手写下$[n,m]$之间所有整数,会有多少数看起来和在镜子里看起来一模一样?$n,m<10^{44};T<10^5$
注:由于这里考虑到的镜像,只有$0,1,8$的镜像是自己本身。所以,这里的“一模一样”并不是传统意义上的回文串,而是只含有$0,1,8$的回文串。
解法
awa这道卡了我好几个小时。
首先,在数位DP过程中,显然只有$0,1,8$不会被ban。
其次,由于数值超过long long范围,所以$[n,m]=[1,m]-[1,n-1]$不再适用(高精度太麻烦qwq),而是需要对n是否合法进行判断,得出:$[n,m]=[1,m]-[1,n]+check(n)$
镜像解决了,如何判断回文?
我们需要用一个小数组记录一下之前的值。在未超过一半的长度时,只要不超上限就行;在超过一半的长度时,还需要判断是否和与之“镜面对称”的位相等。
需要额外注意的是,这道题的记忆化部分,不需要memset,也不能memset(否则你将T飞)。比较显然的是,对于没有限制的$n$位数,镜像数总是一样的。
鸣谢
独立完成这一篇文章相当困难,故在撰文过程中,参考了不少材料。在此一并提出感谢。
[Mathison]数字组成的奥妙——数位dp
https://www.luogu.org/blog/virus2017/shuweidp
[OI-Wiki]数位 DP http://oi-wiki.com/dp/number/
我觉得其他这些方案也可以接受
The text was updated successfully, but these errors were encountered: