Atcoder ARC101 Ribbons on Tree
题解:
前面牛客网的那个比赛也有一道容斥+dp
两道感觉都挺不错的
比较容易想到的是
f[i][j]表示枚举到了i点,子树中有j个未匹配
这样的话我们需要枚举儿子中匹配状态
这样是n^2的(这是个经典的看似n^3实际n^2)
然后再枚举里面匹配了多少 再*n
所以总复杂度n^3的
计数问题考虑容斥
也就是说 答案=至少有j条不符合的*(-1)^j
这样我们依旧定义f[i][j]如上
但是转移的时候
我们对于这条边选和不选都可以的时候
就不用管具体的匹配状态了
所以不管的时候直接枚举子树转移
另外是这条不匹配的情况
那么就是f[i][0]=-f[i][k]*k个点自由匹配
另外要注意这个容斥系数的问题
k个点自有匹配就是(k-1)*(k-3)*(k-5)....(这个的考虑方法就是每个点肯定是要匹配的,所以每次先找一个点,再找另一个)
代码: