![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数位dp
文章平均质量分 67
untilyouydc
月份未到你也得接受
展开
-
leetcode 600. 不含连续1的非负整数
非常明显的数位dp。有两种状态表示的方法。1。dp[pos][pre[sta] 表示到第pos位,前一位为pre,当前状态为sta的个数。class Solution {public: int dp[40][2][2]; int bit[40]; int dfs(int pos,int pre,int sta,bool limit) { ...原创 2020-02-15 09:36:21 · 219 阅读 · 0 评论 -
数位dp小结
数位dp小结关于limit的问题在数位dp中,limit的作用主要有两个。控制枚举的界限,倘若没有界限,每一位的枚举范围都是0-9. 但如果有界限,那么可能不能取到9. 例如求1到311范围内不含有连续两个1的个数。当百位枚举到了3,那么如果你的十位只能枚举0-2.控制剪枝的合法性: 很明显,相比于暴力搜索,数位dp唯一的优势就是剪枝。但剪枝往往会带来一些错误。在数位dp中,我们进行剪...原创 2020-02-04 12:34:01 · 259 阅读 · 1 评论 -
LeetCode 357. 计算各个位数不同的数字个数
解题思路非常经典的数位dp。麻烦的地方在于要处理前导0.例如010这样的数据如果不处理前导0的话,会认为有两个0.数位dp的思路这里不再阐述。dp[pos][sta]表示前pos位,状态为sta满足题意的数的个数。注意使用位运算来查看有没有重复的数。代码class Solution {public: long long dp[30][1<<11]; int...原创 2020-02-04 12:31:45 · 188 阅读 · 0 评论 -
Segment Sum CodeForces - 1073E (经典数位dp统计和问题)
题意:给出l,r求出区间里,满足不同数的个数小于等于k的数的和。思路:先解决第一个问题:如何统计不同数的个数?思路很简单,因为只有0到9这10个数字,每出现一个新数字,将其用二进制状态表示出来,那么我们只要统计最后状态即可知道有多少个不同的数字。第二个问题:如何计算和? 首先一个错误的思路会这样想,dp[pos][sta]表示枚举到pos位时,当前状态为sta的满足条件的数的和,也就是每次...原创 2018-11-07 18:53:54 · 390 阅读 · 1 评论 -
Enigma Gym - 101889E(数位dp+记录路径)
思路:按数位dp的枚举思路,当遇到第一个满足的就直接return .注意边界条件就行。代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;const int MAXN = 1e4+10;char s[1005];int n;int mod;int a[1005];int dp[...原创 2018-09-30 00:12:48 · 334 阅读 · 0 评论 -
Math teacher's homework UVA - 1489 (脑跑数位dp +组合计数)
网上对这题的分析寥寥无几,分析的更是惨不忍睹,让人望而生畏。我参考的博客 他写的思路是有道理的,但不看几个小时是无法理解的。我的想法:首先这题,你不可能像别的数位dp一样,真的去dfs写出了,因为它是个计算方案数的问题,并且可选的数有n个。但它还是一个数位dp,为什么?因为它还是利用了枚举位的思想去解决。首先第一个思想:它最后要求要异或值为k,我们可以转换一下思路,我们不盯着最后...原创 2018-09-29 08:33:51 · 334 阅读 · 0 评论 -
Apocalypse Someday POJ - 3208 (数位dp+二分)
思路:dp[i][fpre][pre][sta]表示前i为,前面两个数分别为fpre,pre,状态为sta的满足题意的个数。二分出一个相近的数,然后一个个实验就行。代码:#include <iostream>#include <algorithm>#include <string>#include <string.h>#incl...原创 2018-09-28 16:37:49 · 219 阅读 · 0 评论 -
Bits Problem HDU - 5106 (数位dp)
思路:这题和A Math Problem HihoCoder - 1259的解决方法非常类似。这个问题其实可以考虑分解成两个子问题,第一:前i位数中有多少个数满足有n个1,第二:前i位数中,满足条件的和。对于问题1,一般的思路是:dp[i][j]表示前i位,含有1的个数为j的有多少个,dfs时,判断j==k就行了。但是这样明显有一个缺点,那就是不能记忆化,因为当第二次k的值和第1次不同...原创 2018-09-28 15:10:51 · 138 阅读 · 0 评论 -
A Math Problem HihoCoder - 1259 (数位dp+推公式)
思路:先根据公式中,3f(n)和1+3f(n)互质的关系,列出等式,可以推出,f(n)是一个3进制数。所以dp的时候按三进制展开就行。因为模数不定,所以每次都要把模数传进去,其次对于f%k==t,考虑将其转化成(f-t)%k==0,这样就可以放dp里面记忆化。dp[mod][re][pos]表示第pos为余数为re,模数为mod.代码:#include <bits/st...原创 2018-09-28 00:36:26 · 172 阅读 · 0 评论 -
A serious math problem HDU - 5435 (数位dp+大数+计数问题)
思路:每一位取值只能是0到9,可以证明0到9中的数进行异或操作,不管多少个数进行异或,最后的值都不可能超过16,因为16转化为二进制是10000,已经是5位二进制数了,最坏情况是4位都是1,1111==15。所以我们可以利用这个关系,解决和太大,无法利用dp记忆化的问题。也就是说求异或和的问题,转化成了一个,先求出最后答案为0-15的异或值有多少个的问题,只要计算出每种异或值有多少个,求总和只...原创 2018-09-27 22:58:15 · 179 阅读 · 0 评论 -
SGU 390 Tickets(上下界都有限制的数位dp)
题意有一位售票员给乘客售票。对于每位乘客,他会卖出多张连续的票,直到已卖出的票的 编号的数位之和不小于给定的正数k。然后他会按照相同的规则给下一位乘客售票。初始时, 售票员持有的票的编号是从 L到 R的连续整数。请你求出,售票员可以售票给多少位乘客。数据规模:1≤L≤R≤1018,1≤k≤1000。思路这题不在像以前的题目一样求前缀和相减就行,因为它的起点对答案有影响,所以考虑同时...原创 2018-09-10 19:01:16 · 361 阅读 · 0 评论 -
Balanced Number HDU - 3709 (数位dp+枚举+去重)
A balanced number is a non-negative integer that can be balanced if a pivot is placed at some digit. More specifically, imagine each digit as a box with weight indicated by the digit. When a pivot is ...原创 2018-08-15 10:02:53 · 146 阅读 · 0 评论 -
XHXJ's LIS HDU - 4352 (数位dp+状压+nlngn的最长上升子序列求法)
题意:求[l,r]区间里数字满足最长上升子序列为k的个数。思路:数位dp首先需要将含有那些数字转化成二进制状态,对于一个新的数位,利用nlogn的思路对状态进行更新,但是需要注意,需要判前导0,因为只有没有前导0的才是数字。要点就是n*logn状态的写法,其实它的思想就是将最后一位尽可能的小,看代码应该可以理解。思路:#include <iostream>#in...原创 2018-08-14 21:39:16 · 244 阅读 · 0 评论