![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
动态规划----数位DP
#
夕林山寸
这个作者很懒,什么都没留下…
展开
-
第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(上海) C Sum of Log 数位DP
看到这个是式子,本能的去考虑枚举一些东西。 显然logx 最多有30种取值 枚举log(i+j)是一个不错的选择。 log(i+j) == x时, 2^x <= i+j <= 2^(x+1) - 1; 相当于求i、j的方案数,满足i/j二进制下至少有一个第x位取1,然后高位全取0,且低位每一位做多一个数取1,且满足X,Y的上界要求。 显然这是一个经典的数位DP。 直接暴力搞即可。 但是裸的数位DP刚好会T,30*30*4*100000 刚好T掉。。评测机不行啊。 所以我们要利用原创 2020-12-18 10:57:38 · 194 阅读 · 0 评论 -
Comet OJ - Contest #12 XOR Pair 数位DP维护绝对值小于某个数
如果不考虑|x-y|<=m 就是一道经典数位dp题。 我们当然可以直接维护 x-y 的值,最后判断,但这样空间非常大,完全开不下。 所以我们要对这个式子进行一些变化: |x-y|<=m y - x >= -m ,x - y <= m y + m - x >= 0 ; x + m - y >= 0; 由于x,y,m每一位都只能取1,0 所以每一位的取值范围:[-1,2]; 而如果上一位的取值大于等于1,或小于等于-2,则后面的值不会影响前面。 若上一...原创 2020-09-23 20:46:51 · 161 阅读 · 0 评论 -
2019牛客暑期多校训练营(第七场) H Pair 数位DP 维护两个数 异或 与 关系
ll dp[33][2][2][2][2][3][3]; 表示: A和B 填到第i位,(前面i-1位已经填完,现在开始填第i位),前面i-1位是否达到A的上界(la),是否达到B的上界(lb); A的第i-1位是否是前导0(ifa0),B的第i-1位是否是前导0(ifb0) , 前i-1位填的结果,A &B > C 则为2,A & B == C 则为1,A & B < C 则为0.(比较的是AB前i-1位填的结果与C的前i-1位比较),最后是: 前i-1位填的结..原创 2020-09-20 21:59:16 · 1456 阅读 · 0 评论 -
2020牛客暑期多校训练营(第六场) Harmony Pairs 数位DP
经典数位DP,两个限制条件。 AB同时跑。B由N限制,A由B限制。 然后就变成经典数位DP的题目了。 细节看代码。 还有两个限制最好开到数组里,虽然浪费点空间,但能省好多时间,我就因为这里T了。。 #include <bits/stdc++.h> using namespace std; typedef long long ll; #define ls (o<<1) #define rs (o<<1|1) #define pb push_back const原创 2020-07-29 23:27:46 · 285 阅读 · 0 评论 -
P4317 花神的数论题 数位DP经典题 两种处理方法
乍一看无法数位DP。 但稍加思考发现:sum(i)的取值为1-50(二进制的位数) 所以我们可以把问题转化为:1-N中:各个数位1的个数和为x的数的个数。 这个问题很容进行数位DP,很经典的套路,具体见代码。 这题想+敲就花了不到半小时,但调了好久,只是因为我把nm[i]给取模了mod。(我吐了。。。)显然次幂不能取模。。 #include <bits/stdc++.h> using namespace std; typedef long long ll; #define ls (o原创 2020-07-29 22:02:39 · 166 阅读 · 0 评论 -
P4127 [AHOI2009]同类分布 数位DP 经典题
这道数位DP对初学者来说还是很有难度的。 //dp[i,j,k]处理到第i位,前面位数字和为j,前面数位组成的数模p等于k,且剩余数未确定的状态下:数模p==0的数的个数 为什么要这么设状态呢? 我们首先分析:要求某个数x,其数位和sm,求x%sm的数的个数。 每个数的x与sm都不同,不方便记忆化。(之前做的数位dp都是只有x未知,不存在其他变量,只存在限制条件) 观察易得:sm最大为9*18,完全可以通过枚举来确定sm,也就是固定一个变量,我们要求所有x%sm==0的数的个数。 这样变量就只.原创 2020-07-29 20:31:48 · 153 阅读 · 0 评论 -
P3413 SAC#1 - 萌数 数位DP 经典题
刚开始看到这题的时候完全没思路。 于是去看题解,看到“ 正难则反 “四个字后,立刻关掉题解(整篇题解只看了这4个字),然后A了这道题。 相信看到这里你也想试一下! 下面说思路,正难则反,考虑1-n种不含回文子串的数。这是个经典问题了:任意连续三个数互不相同即可。 证明: A:如果连续两个数相同,显然会出现长度为2的回文子串。 B:如果一个数与另一个与他相距2的数相同,显然会出现长度为3的回文子串。 显然任意偶回文子串都是由A拓展而来,任意奇回文子串都是由B拓展而来。 只要保证不存在A..原创 2020-07-29 17:37:50 · 196 阅读 · 0 评论 -
P2602 [ZJOI2010]数字计数 基础数位dp, 两种状态维护方法
1:dp[i][j]:处理到第i位,i位之前数码p已经出现了j次,这种情况下,数码p出现的次数。(包括所有数位) 具体细节在代码注释里 #include <bits/stdc++.h> using namespace std; typedef long long ll; #define ls (o<<1) #define rs (o<<1|1) #define pb push_back const double PI= acos(-1.0); const int M原创 2020-07-29 13:32:44 · 186 阅读 · 0 评论 -
P2657 [SCOI2009] windy 数 数位DP基础题
经典数位dp 记录的状态: if0,上一位是否是前导0; limit,上一位是否达到上界; p,上一位的取值; 按照题意把不符合条件的剔除+记忆化+处理好前导0即可。 #include <bits/stdc++.h> using namespace std; typedef long long ll; #define ls (o<<1) #define rs (o<<1|1) #define pb push_back const double PI= aco原创 2020-07-28 22:50:15 · 97 阅读 · 0 评论 -
hdu 2089 不要62 数位DP入门题
重新学数位DP,这次准备学到进阶,至少可以做多校的数位DP的程度。 数位dp跟普通dp一样。 不过阶段变成了数位,状态变成了每一位的取值限制。 用dfs递归+记忆化的方式完成状态转移。 时间复杂度为:dp的数组大小*转移复杂度(一般为10) #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e5+7; ll di[60]; ll dp[60][2]; //d..原创 2020-07-28 22:25:49 · 156 阅读 · 0 评论 -
POJ3252——数位dp
数位DP,难点在处理前导0. #include <cstdio> #include<iostream> using namespace std; typedef long long ll; const int N = 1e5+7; int di[50]; ll dp[50][100];//二进制下 ,0-第i位,1的个数小于等于j的数 的个数 ll dfs(int ...原创 2019-12-10 20:14:30 · 138 阅读 · 0 评论 -
HDU 4734—— 数位DP
题意:F(x) = An* 2n-1+ An-1* 2n-2+ ... + A2* 2 + A1* 1,Ai是十进制数位,然后给出a,b求区间[0,b]内满足f(i)<=f(a)的i的个数。 比较常规的数位dp dp[i][j]:低于i位数字的数中小于j的个数。 然后从高位到第位进行数位dp,记录前面位累加的F贡献。 减去小于FA,和超上界。 搞搞就行 #in...原创 2019-12-10 16:59:40 · 124 阅读 · 0 评论 -
hdu 2089
入门数位dp 题, 把我hdu3555 代码稍加改动 就可以过 #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e5+7; ll di[20]; ll dp[20][2]; ll dfs(int len,bool if6,bool limit) { ...原创 2019-08-09 19:20:38 · 153 阅读 · 0 评论 -
数位dp 入门 hdu3555
数位dp的入门题 : 数位dp 一般dfs写法比较简单,适合入门。 比如我们要算0-5123中不包含49的数的个数 从高到低,即从第4位开始往下dfs计算数量 对于第4位 从1--4我们可以直接 dfs到下一层计算所有的不包含49的数量 第3位 一样// 即空格左边的数是可以直接向下递归的。 位 i==4 01234 56789 位 i==3 ...原创 2019-08-09 19:07:49 · 185 阅读 · 0 评论