既然是从小编号连至大编号,那么有一个简单的想法是按照编号顺序进行 DP。
设 end(i) 表示以点 i 结尾的合法路径的条数。
设 fi,j,k,h 表示前 i 个点,有 j 个白点满足其 end 值为奇数,有 k 个黑点满足其 end 值为偶数,n∑i=1end(i)≡h(mod2) 有多少方案。
考虑转移。
转移时考虑新加入的点的颜色,若新点为黑色,则从 j 个 end 值为奇数的白点中枚举有多少个点与新点有边,并更新 k,h。
这样子即是 O(n4) 的。
然而注意到两点:
- 实际上,并不需要关心具体有多少个 end 值为奇数的异色点与新点有边,我们只需要关心点数的奇偶性。
- 观察转移系数可以发现,实际上转移系数仅与 i 和 j,k 是否超过 0 有关。
由此优化,可以得到一个 O(n) 的状态,而完成这个 DP 也只需要 O(n)。
代码:
1 |
|