数位dp
数位dp常用的思想就是从高位往低位考虑,考虑区间问题时搞前缀和之差,题目的形式多变在于取数的规则,在数据比较大时或者规则比较复杂时需要结合字符串的一些算法进行处理(好吧AC自动机都不会不配写这种题)
例题:不含前导零且相邻两个数字之差至少为 2 的正整数被称为 windy 数。windy 想知道,在 aa 和 bb 之间,包括 aa 和 bb ,总共有多少个 windy 数?
套用上述数位dp的特色思想预处理一下状态,so easy...
树形dp
树形 DP,即在树上进行的 DP。由于树固有的递归性质,树形 DP 一般都是递归进行的。
例题:某大学有 N个职员,编号为1~N 。他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数ai ,但是呢,如果某个职员的上司来参加舞会了,那么这个职员就无论如何也不肯来参加舞会了。所以,请你编程计算,邀请哪些职员可以使快乐指数最大,求最大的快乐指数。
像这样进行树上的dp,常常以根节点作为状态进行状态的转移。
换根 DP(也是树上dp的一种)
树形 DP 中的换根 DP 问题又被称为二次扫描,通常不会指定根结点,并且根结点的变化会对一些值,例如子结点深度和、点权和等产生影响。
通常需要两次 DFS,第一次 DFS 预处理诸如深度,点权和之类的信息,在第二次 DFS 开始运行换根动态规划。
例题:给定一个N个点的树,请求出一个结点,使得以这个结点为根时,所有结点的深度之和最大。
上述问题只要跑多两次dfs就能解决。
由此可见,dfs对于树上dp的重要地位。
你以为树形dp就这么简单,too young too naive...