进击的DP----数位DP入门到理解
来源:互联网 发布:snp面膜怎么样知乎 编辑:程序博客网 时间:2024/05/01 22:34
今天是集训的第一阶段的结束。
第一阶段 是以DP入门为主。因为智力真的有限,学长介绍了那么多的DP实在有点接受不了,所有这几天一直在搞数位DP。
先谈一些我的理解,在我看来,数位dp就是一种优雅的暴力。
数位DP是一类计数问题。
具体题目大体以,统计一个区间【L,R】内,满足条件的数有多少个。
数位dp特征:一般L,R都会取1e9~1e18之间的数。
因为只是入门,所以大体介绍一下。
在我看来,数位dp有三种解决方法。
一.DFS记忆化搜索
这应该是最常见的解决方法了,对状态进行搜索。DFS搜索进行排除不合意的条件。
通常都会有模板。(偷自一位dalao的博客)
int dfs(int i, int s, bool e) { if (i==-1) return s==target_s; if (!e && ~f[i][s]) return f[i][s]; int res = 0; int u = e?num[i]:9; for (int d = first?1:0; d <= u; ++d) res += dfs(i-1, new_s(s, d), e&&d==u); return e?res:f[i][s]=res;}
其中:
f为记忆化数组;
i为当前处理串的第i位(权重表示法,也即后面剩下i+1位待填数);
s为之前数字的状态(如果要求后面的数满足什么状态,也可以再记一个目标状态t之类,for的时候枚举下t);
e表示之前的数是否是上界的前缀(即后面的数能否任意填)。
for循环枚举数字时,要注意是否能枚举0,以及0对于状态的影响,有的题目前导0和中间的0是等价的,但有的不是,对于后者可以在dfs时再加一个状态变量z,表示前面是否全部是前导0,也可以看是否是首位,然后外面统计时候枚举一下位数。It depends.
于是关键就在怎么设计状态。当然做多了之后状态一眼就可以瞄出来。
博客地址:http://www.cnblogs.com/jffifa/archive/2012/08/17/2644847.html二.预处理区间
先对所有的特征片段区间进行筛查,排除不可能或者可能的情况,用数组保存
然后将n进行分解,利用for循环进行判断,得出正确结论
三.强行DP数组暴力
来自我学长的代码的启示,利用几层for循环进行暴力。。(只是对比前两种方法得出的结论)
可能这么说有点吃力也不好懂。。毕竟是一只萌萌的菜鸡。结合具体题目来写吧
- 进击的DP----数位DP入门到理解
- 【codevs1359】【BZOJ1833】数字计数,进击的学弟与数位DP
- 数位DP入门+数位DP模板
- 数位DP入门题两枚
- 数位DP入门Ural1057
- hdoj_2089 【数位dp入门】
- 数位dp入门
- hdu3555 数位dp 入门
- HDU2089 数位dp入门
- HDU3555 数位DP入门!
- 数位DP入门题
- 数位dp入门详解
- 数位DP入门-SCOI2009
- 数位dp入门
- 数位DP入门
- 数位dp入门+模板
- 数位DP入门
- 数位dp总结 之 从入门到模板
- ubuntu16.04 server 安装 docker CE
- FFT & NTT 学习 模板
- 数据结构-哈希表原理详解
- Servlet单例多线程工作机制
- 阿里云上部署kafka--遇到的坑
- 进击的DP----数位DP入门到理解
- 设计模式-命令模式-command-python
- Nginx的Session一致性
- 关于ntp时间同步理论及配置参数20170804
- 常用的接口对接
- bootstrap导出table数据到excel
- 二叉树非递归遍历方法
- 获取python包的路径
- POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化)