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

摘要:原题链接 考察:数位dp+高精 思路: 数位dp太裸了,所以考察的是高精,参考大佬写了压位的高精,以后可以拿出来%. 转移的第三重循环不要从0~M,而是枚举这一位数字是什么. ##Code #include <iostream> #include <cstring> #include <algori 阅读全文
posted @ 2021-06-18 17:29 acmloser 阅读(18) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:数位dp 思路: 求回文数字的个数. dfs参数: 1.pos 枚举到第几位 2.len 回文数的长度. 其实不需要变量记录是否合法,不合法的不取搜就行了. ##Code #include <iostream> #include <cstring> using namespace s 阅读全文
posted @ 2021-06-01 00:14 acmloser 阅读(35) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:数位dp 思路: 定义一个变量st,目前枚举的数字的状态. st==0 跟上位比递减 st==1 跟上位比严格递增 st==2 出现了山峰现象. 如果出现了与上位相等或者之前出现了山峰现象,直接把状态传递下去. Code #include <iostream> #include <c 阅读全文
posted @ 2021-05-31 12:00 acmloser 阅读(41) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:数位dp 思路: 预处理f[i][j][k]表示前i位数,最高位是j,k出现的次数. f[i][j][k] = \(\sum_{t=0}^9\) f[i-1][t][k]; (j!=k) f[i][j][k] = 10i-1+\(\sum_{t=0}^9\) f[i-1][t][k] 阅读全文
posted @ 2021-05-31 02:06 acmloser 阅读(36) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:数位dp 莫得思路,参考大佬的题解(.) 思路: 1. 整除所有数位的数 == 整除所有数位的lcm 2. sum%(a*b)%b = sum%b; dp方程: f[pos][pre_sum][pre_lcm]+=f[pos-1][pre_sum*10+i][lcm(pre_lcm, 阅读全文
posted @ 2021-05-30 23:43 acmloser 阅读(29) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:数位dp 这道题能用递推的方式实现吗...如果有请告知本蒟蒻(.) 错误思路: 建立dp数组f[pos][len][last]表示枚举到第pos位,目前长度为len,上一位是last的情况.如果我们枚举的i>last,len+1.如果i<=last,len不变,last不变. WA数 阅读全文
posted @ 2021-05-30 15:17 acmloser 阅读(42) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:数位dp+状压dp 思路: 因为要求每个数字的出现次数,我们只能把所有数字的出现次数记下来.因为数字比较少考虑状压.有三种状态: 0:没出现过 1:出现奇数次 2:出现偶数次 这道题的状压dp预处理并根据情况计数感觉不是很好实现,如果用记忆化搜索我们只需要到终点看是否合法就行.注意前 阅读全文
posted @ 2021-05-30 11:07 acmloser 阅读(31) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:数位dp 思路: 预处理的思路就是像背包dp那样不超过体积V的方案数,这里V对应f(a). #include <iostream> #include <cstring> #include <vector> using namespace std; typedef long long 阅读全文
posted @ 2021-05-29 22:53 acmloser 阅读(52) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:数位dp 这个用循环没想出来怎么写,反倒是dfs写法很容易理解(.),菜是原罪,如果有循环预处理写法请告诉本蒟蒻QAQ. 思路: 参考数位dp记搜模板.dfs带四个变量: LL dfs(int pos,int sum,int mid,bool limit) /*分别是枚举到第几位,平 阅读全文
posted @ 2021-05-29 20:57 acmloser 阅读(32) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:数位dp 思路: 入门题(然后做了一个小时) 这里预处理方案数是用组合数.如果我们直接套模板会发现答案不对,因为我们不同数字的二进制位数不同,前导零不应该被计入. 先算出n有的二进制位数符合条件个数,然后再计算二进制位数比n小的即可. ##Code #include <iostrea 阅读全文
posted @ 2021-05-29 15:23 acmloser 阅读(31) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:数位dp 思路: 只从看了那道CF55D题我数位dp越写越懵(.) 这道题用容斥原理写的,有正常的循环写法: GO 要注意求的数不同,最后判断条件也不同. Code #include <iostream> #include <cstring> #include <vector> us 阅读全文
posted @ 2021-05-29 13:58 acmloser 阅读(32) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:数位dp 思路: 应该是入门题,但我WA了两次....这道题直接求连续的49反而不大好求,我们反过来求不连续49的个数,然后再减去即可. ##Code #include <iostream> #include <cstring> #include <vector> using nam 阅读全文
posted @ 2021-05-29 11:47 acmloser 阅读(32) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:数位dp 思路: 预处理时,不计入每位数字为4或首位为6,次位为2的数字. 但是注意计算左分支的时候,我们是ans+=f[i+1][枚举的数字],如果枚举的数字为2,实际还需特判上一位.因为预处理首位数字为2时没有考虑上一位是什么. Code #include <iostream> 阅读全文
posted @ 2021-05-28 09:50 acmloser 阅读(34) 评论(0) 推荐(0) 编辑