随笔分类 -  动态规划之数位dp

摘要:"bzoj1833" Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次。 Input 输入文件中仅包含一行两个整数a、b,含义如上所述。 Output 输出文件中包含一行10个整数,分别表示0 9在[a,b]中出现了多少次。 单独考虑每 阅读全文
posted @ 2018-07-11 09:13 walfy 阅读(179) 评论(0) 推荐(0) 编辑
摘要:windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,在A和B之间,包括A和B,总共有多少个windy数? 数位dp,前导0的情况要考虑掉,dp【i】【j】【2】开三位表示i长度,j前一位是什么,k前面是不是全是前导0 //#pragm 阅读全文
posted @ 2018-04-13 00:25 walfy 阅读(198) 评论(0) 推荐(0) 编辑
摘要:题意:求某一区间内的平衡数个数(指一个数,其中出现过的数,如果是偶数,那么必须出现奇数次,反之偶数次) 题解:用三进制来枚举(0到9)所有情况,0代表没有出现,1代表出现奇数次,2代表出现偶数次dp【i】【j】i代表位数,j代表状态,在记忆化搜索的时候要记录0是否出现过 (因为之前很少写3进制的状态 阅读全文
posted @ 2017-09-01 15:18 walfy 阅读(201) 评论(0) 推荐(0) 编辑
摘要:题意:求某一区间内的平衡数(指在某一数位开始,左右两边的权值相同,如4119:4*2+1*1=9*1,以1 为支点,该数是平衡数) 题解:枚举所有的支点,求和,dp【i】【j】【k】i是位数,j是支点位置,k是两端权值和,左边为正,右边为负,i为0时,k为0,那么该数就是平衡数 #include<b 阅读全文
posted @ 2017-09-01 12:28 walfy 阅读(126) 评论(0) 推荐(0) 编辑
摘要:题意:找0到B中权值小于等于A权值的数目(权值按每个位数上的二进制计算) dp[i][j] i-长度为i,j-权值,dp[i][j代表长度为i,小于j的个数 刚开始把j代表f(x),但是当a,不同时,dp结果不同这样会超时 #include<bits/stdc++.h> #define C 0.57 阅读全文
posted @ 2017-08-26 13:48 walfy 阅读(118) 评论(0) 推荐(0) 编辑
摘要:这题不是用10进制储存的,要转化成2进制再计算 dp[i][j][k] i是位数,j是1的个数,k是0的个数 #include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #i 阅读全文
posted @ 2017-08-24 10:51 walfy 阅读(154) 评论(0) 推荐(0) 编辑
摘要:dp[i][j][k] i-i位数,j-开头是j,k-除13的余数 要注意数位dp的时候一定不能直接判断对的来做,必须是判断不对的,然后用全部减 这一题先算出所有%13==0的个数,然后算出所以%13并且不含13的个数,然后相减就是答案了 #include<bits/stdc++.h> #defin 阅读全文
posted @ 2017-08-23 18:55 walfy 阅读(196) 评论(0) 推荐(0) 编辑
摘要:题意:求从l到r中的数能被自己的每一位整除的有多少个 如果x满足条件,那么 x %lcm{digit【i】}==0,又因为digit【i】只可能为1-9,lcm{1,,,9}=2520,所以x%2520%lcm{digit【i】}==0,这样只需存x%2520,节约了空间和时间 从1到10的最小公倍 阅读全文
posted @ 2017-08-23 16:23 walfy 阅读(217) 评论(0) 推荐(0) 编辑
摘要:题意:求1到n的数中含49的有多少个 和上一题类似,但是这题如果直接算含49的会有一点问题,所以先算不含49的然后用n-就好了,注意求1到n算的是n+1的 还有就是这题有毒,必须要用__int64而不能用long long,而且需要交c++,不能用G++ 非递归 #include<map> #inc 阅读全文
posted @ 2017-08-23 13:12 walfy 阅读(118) 评论(0) 推荐(0) 编辑
摘要:数位dp第一题 题意:找从n到m中,不包含4,62(连续)的个数 先预处理出f数组 f[i][j]是以j开头的i位数不包含4,62的个数,可通过递推求解 递推关系式为: f[i][j]=f[i-1][k]+f[i][j];对于第i位,可由第i-1位转移过来,用k枚举第i-1位的所有情况,j枚举第i位 阅读全文
posted @ 2017-08-23 10:44 walfy 阅读(154) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示