[BZOJ2688]Green Hackenbush(概率dp)

题目描述传送门题解博弈论中的树形删边游戏:叶子节点sg=1,剩余节点sg=所有儿子的sg+1的异或和 所有树的根sg异或起来为0则先手必败,否则必胜令g(i,j)表示i个点的随机二叉树根的sg值为j的概率 cnt(i)表示i个点的随机二叉树共有几个(卡特兰数) cnt(i)直接根据卡特兰数的递推公式递推就行了 对于g,枚举其两棵子树的大小,然后dp令f(i,j)表示前i棵树异或值为j的概率
摘要由CSDN通过智能技术生成

题目描述

传送门

题解

博弈论中的树形删边游戏:叶子节点sg=1,剩余节点sg=所有儿子的sg+1的异或和
所有树的根sg异或起来为0则先手必败,否则必胜

令g(i,j)表示i个点的随机二叉树根的sg值为j的概率
cnt(i)表示i个点的随机二叉树共有几个(卡特兰数)
cnt(i)直接根据卡特兰数的递推公式递推就行了
对于g,枚举其两棵子树的大小,然后dp

令f(i,j)表示前i棵树异或值为j的概率
然后枚举用f(i-1)和g(a[i])递推f(i)
最终答案就是将f(n)的所有非0项加和

哦你是不是发现卡特兰数太大了会炸掉啊
但其实用double做的话是没什么问题的= =
好像是因为浮点数什么神奇的运算?
不过还有更科学的方法:用卡特兰数的公式搞一搞
懒得写了。。。

考场上Max写错了,,白掉40分。。心痛

代码

#include<algorithm>
#include<iostream>
#include<cstring>
#includ
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值