
数位dp
文章平均质量分 82
alpc_qleonardo
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
hihoCode 1249 A Math Problem ACM/ICPC 2015 Beijing (数位dp+规律)
题目本身在UVa,但是据说数据有问题,请在hihoCoder上面提交…… 大致题意:告诉你一个整数函数满足的式子,然后f(1)~f(n)每个函数值对K取模,每一个统计取模之后每一个数字出现的次数,数尺所有数字出现次数的异或和。 本来以为是一道找规律题或者说是数论题,但是没想到居然是一道dp?!根据题目给出的表达式,我们容易求出f(n)递推公式:f(2*n+1)=3*f(n)+1,f(2*n)=3*f(n),f(1)=1。然后我们多写出几项f(1)=1,f(2)=3,f(3)=原创 2017-12-10 18:10:36 · 416 阅读 · 0 评论 -
CodeForces 855E Salazar Slytherin's Locket(数位dp+搜索剪枝)
又是一道数位dp。 大致题意是给你一个进制b,然后问你区间[l,r]之间的数字,转换为b进制之后,有多少个数字满足,0~b-1中的每一个数字出现在每一位的次数是偶数。 其实这里加了一个进制,无非就是多了一维表示不同进制,然后分解数字时按照进制分解,枚举每一位数字时枚举到b-1而已。真正关键的还是状态的转移。这里考虑由于要每一个数字出现的次数为偶数,所以我们就可以用奇偶对应0、1来表示。由于最多是10进制,所以我们可以用一个10位的二进制数字来表示0~b-1这些数字出现的次数是原创 2017-09-27 08:13:58 · 588 阅读 · 0 评论 -
CodeForces 55D Beautiful numbers(数位dp+数论)
很明显的一道数位dp,但是转移却并不是那么好想。 大致题意是,让你求区间内所有的能够每一位数字整除的数字有多少个。 最初始的想法是,设置dp[len][x]表示长度为x时且当前为x的倍数的时候的数量,但是在考虑转移的时候却发现,不能很好的处理这个倍数整除关系,每次新加入一个数字就会产生一个新的因子。于是抛弃这个想法。这里,我们考虑利用一些同余的性质,若a≡b(mod m) 且d|m 则a≡b(mod d)。我们可以知道,lcm(1~9)=2520,若a≡b(mod 2520)原创 2017-09-26 00:37:44 · 270 阅读 · 0 评论 -
CSU 1993 大司马的三角形中单(数位dp)
当时不够时间写了,但是后来回来了还是写了写,想清楚后,二十分钟左右就过了。 这里所谓三角形数,就是指数字从第一位开始先严格递增,在严格递减,然后最后有多个0也算是允许的。然后问你在一个区间内,有多少个这样的三角形数。这样的题目很显然就是数位dp。可以考虑,设dp[len][x][tp]表示在数字长度为len,第len位数字为x,tp为bool类型,表示是否已经出现转折点。这里我们先不考虑后面可以有多个0的情况。然后转移的话,要仔细考虑清楚,分几种情况。首先看是否出现过转折点,如果当前状态已经原创 2017-09-02 23:11:51 · 1324 阅读 · 0 评论 -
HDU 3709 Balanced Number(数位dp)
人生第一道数位dp,还几乎是自己想出来的,纪念一下…… 数字要平衡,即力矩平衡。一般来说,数位dp求一个区间内满足条件的方案数,都是要用区间的性质,即对于询问区间[l,r]我们的最后过往往是拿0~r的个数减去0~l-1的个数。然后dp的时候,就按照数位来做。这道题因为有力矩的存在,所以也与支点的选取有关,所以我们要加一维表示支点。dp[i][j][k]表示,当前长度为i支点为j力矩和为k的方案数。那么很容易得出状态转移方程:dp[i][j][k]=sigma(dp[i-1][j][k-x*(原创 2017-07-24 18:29:12 · 361 阅读 · 0 评论 -
CodeChef FAVNUM FavouriteNumbers(AC自动机+数位dp+二分答案)
好久没有写数位dp了,着实快忘记怎么写了…… 大致题意是,给你一些幸运数字,然后问你在一个区间内的第k大的,含有幸运数字的数是哪一个数字。 其实做法也很简单,这种类型的题目一看就知道是数位dp,然后求第k大,肯定是二分枚举这个数字,然后每次数位dp计算小于等于这个数字的范围内有多少个数字满足条件。关键就在于如何判定这个数字是否包含了幸运数字。而AC自动机正好可以解决这个问题,我们把所有的幸运数字加入到AC自动机中,然后我们同样在AC自动机上面dp。dp[len][pos]原创 2018-02-26 15:20:18 · 351 阅读 · 0 评论 -
CSU 2069 Saruman‘s Level Up(数位dp/组合计数)
大致题意:让你求在1到n范围内转换成二进制后1的个数是3的倍数的数字的个数。 典型的数位dp。设置dp[len][x]表示长度为len的二进制数字中含有x个1的个数。显然又转移方程dp[len][x]=dp[len-1][x-1]+dp[len-1][x]。记忆化搜索考虑lim的影响按照套路做即可。但是会发现对于1e8以上的数据就已经会超时了。经过分析可以发现,当len很大而x很小的时候,dfs的层数会比较多,时间消耗比较大。我们可以考虑增大这个x。容易发现,我计算长度为len的数字中1为x的原创 2018-04-17 21:51:29 · 293 阅读 · 0 评论 -
BZOJ 1799 self 同类分布(数位dp)
非常裸的一个数位dp。令dp[len][sum][mod][r]表示长度为len的数字,当前已经有各位数字的和为sum,最后各位数字和为mod,当前数值对mod取模结果为r时的方案数。根据数据范围,我们发现,如果按照这样子开成四维,空间会炸。但是,在实际操作的时候,我们可以通过枚举固定的mod来少掉一维。接下来考虑转移方程,,其中sum>i。退出条件的话,当len==0时,当然要求sum要用完等于0,同时余数要为0。按照普通数位dp记忆化搜索的套路去做即可。具体见代码:原创 2018-07-22 15:23:41 · 290 阅读 · 0 评论 -
2019牛客多校赛 第七场 H Pair(数位dp)
大致题意:告诉你范围A和B,让你求在两个范围内,有多少对数字可以使得二者按位与大于C或者异或小于C。一个比较常规的数位dp,然而比赛的时候由于自己复杂度计算错误,还写了好久的优化,最后发现不优化也能过。我们令dp[len][x][y][lim1][lim2]表示在二进制下,当前长度为len的时候,第一个条件的状态为x,第二个条件状态为j,第一个数字的限制情况为lim1,...原创 2019-08-08 17:20:41 · 818 阅读 · 8 评论