【数位dp】
张松超
这个作者很懒,什么都没留下…
展开
-
CodeForces ~ 55D ~ Beautiful numbers (数位DP + 离散化)
题意 T次询问,每次循问[L,R]区间内有多少个美丽数字?美丽数字:该数字可以被它各个位上的数字整除。 思路 L~R的美丽数字个数,我们可以转化为1~R的美丽数字个数 减去 1~(L-1)的美丽数字个数 ①该数字可以被它各个位上的数字整除 ②该数字可以被它各个位上的数字的LCM整除,①和②互为充要条件 假设数字xxx是美丽数字,那么x%LCMx=0x%LCMx=0 x\%LCM_x =...原创 2018-07-09 10:30:32 · 251 阅读 · 0 评论 -
HDU ~ 3555 ~ Bomb (数位DP)
题意 问1~n区间内有多少个含有'49'的数? 题解 本题同:HDU ~ 2089 ~ 不要62 (数位DP),我们求出来0~n中不含49的个数cnt,n+1-cnt就是含有49的个数。 #include <bits/stdc++.h> using namespace std; const int MAXN = 20; const int INF = 0x3f3f3f3...原创 2018-07-14 17:42:19 · 161 阅读 · 0 评论 -
HDU ~ 2089 ~ 不要62 (数位DP)
题解 ①L~R的符合要求的数字个数,我们可以转化为1~R的符合要求的数字个数 减去 1~(L-1)的美丽数字个数 ②定义dp[pos]为选前pos位的方案数。由于要一位一位的去选,dp方程不太好写,所以选择写记忆化搜索。首先需要记录pos(选到了第几位),pre(上一位选的数字),limit(之前的位是否都选到了上限值)。比如327,如果前两位选了32,那么第三位就只能选1~7,如果第一位没选...原创 2018-07-14 17:37:15 · 383 阅读 · 0 评论 -
HDU ~ 4734 ~ F(x) (数位DP)
题意 T测试数据,每组求[0,B]区间内有多少个数x的F(x)小于F(A), 假设A为一个n位数(),F(A)定义为: 思路 依旧记忆化搜索的思路,定义dp[pos][sum]表示选到pos位,后面的F值加和不超过sum的情况。 #include<bits/stdc++.h> using namespace std; int dp[10][5000], FA; string...原创 2018-07-18 17:36:16 · 296 阅读 · 0 评论 -
HDU ~ 3709 ~ B-number (数位dp)
题意 求[1,n]的区间的B数个数,B数定义为序列中含有“13”,且可以被13整除的数。 思路 数位dp,依旧采用记忆化搜索的方式,然后记录下上一位的数字,和之前选的数字有没有“13” dp[pos][mod][have]表示选了pos位,对13取余为mod,have表示选的pos位有没有13。 #include<bits/stdc++.h> using namesp...原创 2018-07-18 01:19:27 · 209 阅读 · 0 评论 -
SPOJ ~ BALNUM ~ Balanced Numbers (数位DP + 状压)
题意 T组测试数据,每次查询[L, R]区间内有多少个平衡数(Balanced Numbers)。 平衡数定义为:0,2,4,6,8每个数的出现次数为奇数,1,3,5,7,9每个数的出现次数为偶数。2201,不算,因为2出现了两次(偶数次),1出现了1次(奇数次)。 思路 依旧拿记忆化搜索来写数位DP,我们这次需要存下0~9每个数字有没有出现和出现次数的奇偶。 这个状态可...原创 2018-07-23 11:48:36 · 297 阅读 · 0 评论 -
HDU ~ 3709 ~ Balanced Number (数位dp)
题意 求[L,R]区间内Balanced Number有多少个,Balanced Number定义为:可以以某个数作为支点,左右两边力矩和相等的数字。 比如:4139,我们选3作为支点,4和支点距离为2,1和3距离为1,9和3距离为1。4*2+1*1=9*1,那么4139为平衡数。 思路 首先对于一个数,不可能有两个支点。同样数位DP的做法,我们枚举一下这个支点位置就好了。 dp[...原创 2018-07-17 17:43:46 · 325 阅读 · 0 评论 -
HDU ~ 4352 ~ XHXJ's LIS (数位DP + LIS + 状压)
题意 [L,R]区间内,各位数字组成的LIS(严格上升)长度为K的个数? 思路 如果还按照记忆化搜索的方式来写,那么我们过程中需要维护的是选了一个数字之后LIS的变化,我们应该怎么维护呢? 大家应该知道LIS的nlogn的求解方法。不会自行查找学习。 我们用dp数组的一维来表示我们选的这些数字的 LIS 情况,每当新加来一个数字时,我们就把他替换到第一个能替换的数字位置(LIS的更...原创 2018-07-16 22:33:11 · 318 阅读 · 0 评论 -
POJ ~ 3252 ~ Round Numbers (数位DP)
题意 求[L,R]区间有多少个round numbers? round numbers:二进制下0的个数不少于1的个数。 思路 思路基本同HDU ~ 2089 ~ 不要62 (数位DP) dp[pos][zero][one]表示选了前pos位,zero个0,one个1。 注意前导0不能算0的个数,,, //#include <bits/stdc++.h> #i...原创 2018-07-16 17:49:56 · 263 阅读 · 0 评论 -
HDU ~ 4507 ~ 吉哥系列故事――恨7不成妻 (数位DP + 完全平方公式)
思路 依旧是数位DP, 我们需要过程中需要维护数字num%7和每一位的和sum%7。 所以定义DP[pos][mod1][mod2]表示选到pos位置num%7=mod1和sum%7=mod2的答案。 如果答案是要数字个数就好办了,但是答案要的是平方和。如果第二位我们去存当前选的数字num,而不是num%7,我们内存会炸,不可行。 大家应该还记得完全平方公式吧,即,假设要求一个两位数x...原创 2018-07-22 18:29:56 · 591 阅读 · 0 评论