ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

缩树游戏(tree)

2021-09-22 18:04:01  阅读:98  来源: 互联网

标签:子树 游戏 缩树 siz tree 枚举 答案 假设 节点


代码稍后补充
Sol
考虑树形DP。以1为根,其余同理
设方程\(f[i][j]\)表示当前搜到搜索标号为\(i\)的节点,该节点剩余\(j\)条边,并保证根节点未被删除的方案数。
先考虑链的情况:只有单子树。
枚举子树状态:假设子树的根标号为\(x\),得到\(f[x][0—siz[x]]\),现在要求\(f[i][0—siz[i]]\)
枚举统计\(f[i][j∈[0,siz[x]]]\):每次枚举\(f[x][k∈[0,siz[x]]]\),对于\(j,k\)分类讨论:

  • \(k<j\),表示选择\(x\)子树中的\(k\)条边,并且由于有剩,所以根转移到了\(x\),需要将答案乘2的逆元,得到方程\(f[i][j]+=inv2*f[x][k]\);
  • \(k>=j\),表示选择了\(x\)子树中的\(j\)条边并有剩(\(≥0\)),所以没有转移根,得到方程\(f[i][j]+=f[x][k]\)

相信你已经懵了,总之就是在树形DP的时候要先统计子节点的子树的答案(由于需要特殊计算)

接下来的部分是多子树的合并:假设已经得到了前面的所有子树答案,现在新加入一个新子树求答案增量。

(下面的内容\(i,j,k\)不与上面对等,是分开计算的)
假设以前计算的答案是\(f[i][j]\),当前枚举到\(x\)子树,选择\(g[k]\)(假设\(g[k]\)表示之前枚举\(x\)的子节点数得到的答案),那么更新的答案就是\(f[i][j+k]=f[i][j]*g[k]*C(j+k,j)*C(x+y-j-k,x-j)\)(\(x,y\)分别表示树\(i\)的原边数和现在\(x\)子树的边数),表示答案乘上对应的选择方案。

然后就愉快地结束辣!

(感觉懵是正常现象,因为我写的时候是晕的)

标签:子树,游戏,缩树,siz,tree,枚举,答案,假设,节点
来源: https://www.cnblogs.com/orzlsw/p/15320994.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有