热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【BZOJ2688】2688:GreenHackenbush(概率DP+博弈-树上删边)

2688:GreenHackenbushTimeLimit:10SecMemoryLimit:128MBSubmit:42Solved:16D

2688: Green Hackenbush

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 42  Solved: 16

Description

  有一个古老的游戏叫做Green Hackenbush,游戏是这样进行的:两个人轮流在一棵树上删边,每次删边后不与根联通的子树直接被ignore,不能删边的游戏者输。Alice和Bob也在玩这个游戏,不过他们面对的是n棵树,第i棵树是含有a[i]个节点的二叉树。先手的Alice想知道自己有多大的概率获胜(假设我们的Alice和Bob同学都是无限聪明的)。

Input

  第一行一个数n。
  接下来每行一个数a[i]。

Output

  一个保留6位小数的实数ans。

Sample Input

1
2

Sample Output

1.000000


HINT

  对于100%的数据,n<=100,a[i]<=100

 

 

【分析】

  想到了,但是以为过不了的复杂度。。

  树上删边游戏有一个结论就是:树的sg值等与子树的sg值+1的乘积。

  证明具体看:http://www.cnblogs.com/Konjakmoyu/p/5412444.html

  f[i][j]表示规模为i的子树,其sg为j的概率。

  因为是二叉树,枚举一下子树就好了。概率用方案数/总方案数 求,这个方案数呢是卡特兰数啊显然,然后dalao说用double就好了?

  【然后四重循环的复杂度也很迷人。。

  然后把多棵树合起来就是g[i][j]表示前i棵数,sg异或和为j的概率。

  最后把sg不为0的概率加起来就是答案。

 

 1 #include
 2 #include
 3 #include
 4 #include
 5 #include
 6 using namespace std;
 7 #define Maxn 210
 8 
 9 double f[Maxn][Maxn],sm[Maxn];
10 double g[Maxn][Maxn];
11 int a[Maxn];
12 
13 int main()
14 {
15     int n,mx=0,M;
16     scanf("%d",&n);
17     for(int i=1;i<=n;i++) {scanf("%d",&a[i]);mx=max(mx,a[i]);}
18     M=1;while(M<=mx) M<<=1;M--;
19     f[1][0]=1.0;sm[1]=1;
20     for(int i=2;i<=mx;i++)
21     {
22         sm[i]=sm[i-1]*2;
23         for(int j=0;j<=M;j++) f[i][j]=f[i-1][j-1]*2*sm[i-1];
24         for(int j=0;j)
25         {
26             sm[i]+=sm[j]*sm[i-j-1];
27             for(int k=0;k<=M;k++)
28              for(int l=0;l<=M;l++)
29              {
30                  f[i][(k+1)^(l+1)]+=f[j][k]*f[i-j-1][l]*sm[j]*sm[i-j-1];
31              }
32         }
33         for(int j=0;j<=M;j++) f[i][j]/=sm[i];
34     }
35     g[0][0]=1.0;
36     for(int i=1;i<=n;i++)
37     {
38         for(int j=0;j<=M;j++)
39          for(int k=0;k<=M;k++)
40           g[i][j]+=g[i-1][k]*f[a[i]][j^k];
41     }
42     double ans=0;
43     for(int j=1;j<=M;j++) ans+=g[n][j];
44     printf("%.6lf\n",ans);
45     return 0;
46 }
View Code

 

2017-04-21 18:32:45


推荐阅读
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
author-avatar
快乐小天使2602926543
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有