数位dp
文章平均质量分 75
Lazines_by
好吧,我要工作了
展开
-
数位dp
bzoj 1026 windy数 刚开始学这个数位dp,感觉都这个题不错,再很多地方都提供了思路: 题意:windy数就是这个数相邻两个数位的数相差不能小于2的数,给出一个区间,计算出这个区间的windy数有多少个? 数据范围 2000000000 思路: 刚开始尝试用递归,tle,果断放弃;学到了数位dp,dp[ i ][ j ], i 表示的是数有i位,j 表示的是最高位即第i原创 2017-01-11 18:08:51 · 294 阅读 · 0 评论 -
hdu 4507 数位dp(好题)
题解:数位dp 和简单的数位dp不同,这道题要算所有合法数的平方和 考虑到一个数可以写成X=ΣAi*Pi,(其中Ai为X每一位的值,Pi=10^i) 因为(A+B)^2=A*A+2*A*B+B*B (X1+X2+X3+...+Xn)^2=X1^2+2*X1*(X2+X3+...+Xn)+(X2+X3+...+Xn)^2 =X1^2+2*X1*(X2+X3+...+Xn)+X2^2原创 2017-11-28 18:32:42 · 240 阅读 · 0 评论 -
51Nod 拉勾第一题(数位dp)
题意:找出1 ~ n中所有的数中的1的个数。 分析:数位dp,调着调着就出来了。记录了一下前面数字中1的值,然后进行操作的时候的时候要加上,然后记录的时候需要减去。 #include using namespace std; typedef long long ll; typedef pair P; #define fi first #define se second #defin原创 2017-09-28 16:22:16 · 182 阅读 · 0 评论 -
lightoj 1205(回文数的数量 数位dp)
经典数位dp,思路就是在数的前一半的时候随意枚举,但是要考虑前导零,后一半跟前边对称就行。 #include using namespace std; typedef long long ll; typedef pair P; #define fi first #define se second #define INF 0x3f3f3f3f #define clr(x,y) memset原创 2017-08-22 09:42:47 · 752 阅读 · 0 评论 -
hdu 6148(数位dp)
题意:找出小于等于n的一直递增或者一直递减或者先递减后递增的数的个数。0不算。 思路:用两个flag分别标记F是否出现了递减和递增,然后直接进行就行。 PS:刚开始打百度之星复赛的时候交上去总是WA,赛后跟过了的队友对拍数据都没有错,GG,但总是过不去。 今天重打一遍之后,AC了。 #include using namespace std; typedef lo原创 2017-08-19 09:13:58 · 385 阅读 · 0 评论 -
Codeforces 96E(数位dp)
题意:找出l,r之间的符合至少有幸运数字相差不超过k的数的个数。 思路:明显的数位dp.思路很简单。但是一直WA在第16个测试样例,因为pre刚开始设置为k + len,想着这样能保证第一个与他相减能使得不低于k,然而pre作为dp数组里的记忆话的元素,并不能频繁地改变,长记性了。 #include using namespace std; typedef long long ll;原创 2017-08-17 09:56:56 · 340 阅读 · 0 评论 -
codeforces55D(离散化数位dp)
题意:问[L,R]10^18区间里面有多少个beautiful的数,beautiful数是每一位上的!0都被这个数整除。 思路:一个数能被它的所有数位上数整除的话,那么它就能把它的数位上的数的lcm整除。数位上的数最多是1-9,lcm最大为5 * 7 * 8 * 9 = 2520; 将前边的sum值保存一下前面的值,但是数会很大,dp数组存不下。我们要想好办法将这个数变小。因为lcm最原创 2017-08-02 21:50:37 · 475 阅读 · 0 评论 -
poj3252(数位dp)
题意:给出一个区间,在区间中找出用二进制表示的话0的个数大于1的个数的数的个数。 思路:先将数排成二进制的数,然后对比他小的数进行搜索,记录0,1的个数cnt1,cnt2.注意这里要去除前导零,因为前面如果都是零的话,这些零的个数不算那个数的。 PS:刚开始一直用dp[pos][pre]进行记录,发现当pre的pre是1的时候,也许这个dp[pos][pre]不能加上了,因为这样会使1的个数增原创 2017-07-22 21:07:39 · 318 阅读 · 0 评论 -
数位dp hdu2089 ,4734,bzoj 1026
PS:第一次有信心地去写数位dp. hdu 2089: 题意:求L,R区间中不含4,和62的数的个数。 思路:记录前一个数,如果前一个数是6,那么这个数就不能是2;4的话直接判断不加入数中。 记忆化在全局会省时间,每次要判断是否是这个数的上界。 #include using namespace std; const int maxn = 20; typed原创 2017-07-22 17:25:39 · 193 阅读 · 0 评论 -
Codeforces 914C (数位dp)
题意:求小于n的并且恰好经过k次变化后成1的数的个数,变化规则为:x -> (x的二进制的1个数); 思路: 应为给出的数二进制位数最多为1000,所以1000 -> 10 -> 3 -> 2 -> 1,差不多就是这样,变化次数k在6以内。所以我们对1000打个表,表示成二进制1的位数为i的时候要经过多少次变成1。 接下来就是数位dp,其实就是记忆化搜索,加上是数位上的操作,称其为数位dp。原创 2018-01-21 11:10:14 · 931 阅读 · 1 评论