【ACM回顾】生成树计数 & 动归初步
生成树计数
周冬《生成树的计数及应用》
\(G的度数矩阵\)
\(D[G]是一个n * n的矩阵,并且满足:当i≠j时,d_{ij}=0;当i=j时,d_{ij}等于v_i的度数\)
\(G的邻接矩阵\)
\(A[G]也是一个n * n的矩阵, 并且满足:如果v_i、v_j之间有边直接相连,则a_{ij}=1,否则为0。\)
\(G的Kirchhoff矩阵(也称为拉普拉斯算子)\)
\(C[G ]为C[G ]=D[G ]-A[G]\)
\(Matrix-Tree 定理\)
\(C[G]的任何一个n-1阶主子式的行列式的绝对值,为所有不同生成树的个数\)
具体证明在看过连通分量以后再研究
动态规划
当某阶段结点一定时,后面各阶段路线的发展不受这点以前各阶段的影响。反之,到该点的最优决策也不受该点以后的发展影响。由此,我们可以把原题所求分割成几个小问题。
需要满足的条件:
-
最优化原理
不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略。
简而言之,一个最优化策略的子策略总是最优的。
-
无后效性
“过去的步骤只能通过当前状态影响未来的发展,当前的状态是历史的总结”。(不回头重来)
这条特征说明动态规划只适用于解决当前决策与过去状态无关的问题。
解决问题的关键:
-
阶段划分
阶段的划分是确定整个动归策略大方向
比如线性DP中的阶段是按顺序从左到右之类,
而树形DP中的阶段则是由子节点(子树)的信息推出父节点的信息
区间DP中的阶段则是由小区间的信息推出大区间的信息
-
确定状态
-
明确约束条件
常见的优化(之后会提到):(毛子青《动态规划算法的优化技巧》)
-
改进状态表示
-
选择适当的规划方向(顺序,逆序,双向.etc)
-
减少状态转移数
- 四边形不等式
- 斜率优化