码迷,mamicode.com
首页 > 其他好文 > 详细

初探数位dp

时间:2018-06-30 22:00:15      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:拆分   geo   转化   时间   blank   技术   条件   IV   div   

  前言:这是蒟蒻第一次写算法系列,请诸位大佬原谅文笔与排版。

 


 

一、导入

  在刷题的时候,我们有时会见到这样一类问题:在区间$[l,r]$内,共有多少个整数满足某种条件。如果$l$和$r$间的差很小,我们可以考虑暴力枚举直接判断。然而,若$l<=r<=10^9$甚至更大呢?

  这时往往就可以用到一种dp方式:数位dp。


 

二、做法:

  这里先放一道例题:1026: [SCOI2009]windy数

  题意:求在区间$[l,r]$内,满足相邻数位的差>=2的整数的个数。

  首先我们可以发现,$[l,r]$的答案=$[1,r]$的答案-$[1,l)$的答案。于是我们可以把问题转化为求$[1,r]$和$[1,l-1]$的答案。因为$l<=r<=2*10^9$,所以暴力枚举肯定行不通。但是我们可以发现这道题中整数需满足的条件只与相邻数位有关,这启示我们,也许可以按位dp?

  我们先来看一张经典的图(表示区间$[0,22]$):

  技术分享图片

 

  这幅图中把正整数按位用树的形式表示,那么区间$[0,x]$(这里x=22)就可以拆成多棵满10叉树(即图中的蓝圈),而且因为每层所用的树个数不会超过10棵(0~9),总共有$\log_{10}{x}$层,则树的个数规模为$O(10\log{x})$。

  那么单棵满10叉树的答案怎么求呢?我们仔细观察这棵树,那么就可以发现每棵满10叉树表示的数是位数相同(等于它从下往上数所处的层数),最高位相同(等于根节点表示的数),且该树的答案只与以树根的10个儿子为根的,10棵子树的答案有关。并且在整棵树中,处在同一层的,且子树根节点表示的数相同的树(即位数相同,最高位相同),它们是等价的。于是我们就可以直接设$f[i][j]$表示有i位,最高位为j的满足条件的整数的个数,然后xjb转移。于是就可以优哉游哉地dp, 然后按图统计答案了。

  不过这道题还是比较麻烦,因为需要排除前导零的影响,不过核心思想还是上面的那样,然后再分位数统计就好了。

  代码(时间复杂度$O(10^2\log{r})$):

技术分享图片bzoj1026

 


 

三、归纳:

  数位dp的特征:数据规模大,统计整数个数,被统计的数满足的条件往往与数位之间的关系或数位间的运算有关。

  基本做法:差分,先按位dp出所需数据($f[i][S]$->i位数,状态为S),然后再拆分原区间,用dp出的数据统计。

 


 

四、其他例题:

  to be continued……(以后吧。。。)

 

初探数位dp

标签:拆分   geo   转化   时间   blank   技术   条件   IV   div   

原文地址:https://www.cnblogs.com/quzhizhou/p/9245648.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!