#icpc2013summerday4e. [icpc2013summer_day4_e]Optimal alpha beta pruning
[icpc2013summer_day4_e]Optimal alpha beta pruning
问题描述
抱歉,问题已经被修改。(12:51 JST)
Fox Ciel正在开发一个游戏的人工智能(AI)。这个游戏可以描述为一个有n个顶点的游戏树T。游戏中的每个节点都有一个评估值,用于显示当前情况的好坏程度。这个值等于子节点值的最大值乘以-1。叶节点上的值是由Ciel的特殊函数评估得出的 - 这个函数的计算比较复杂。因此,她打算使用Alpha-Beta剪枝来获取根节点的评估值,以减少需要计算的叶节点数。
顺便说一下,改变子节点的评估顺序会影响叶节点的计算次数。因此,Ciel想要知道在能够按任意顺序评估子节点时,在叶节点上计算的最小和最大次数。她请你计算最小评估次数和最大评估次数。
添加伪代码。(13:17 JST)
Ciel使用以下算法:
function negamax(node, α, β)
if node是终止节点
返回叶节点的值
否则
对于node的每个子节点
val := -negamax(child, -β, -α)
如果val >= β
返回val
如果val > α
α := val
返回α
[注] 负最大值算法
输入
输入遵循以下格式:
... ... : : ...
第一行包含整数,表示游戏树T中的顶点数。
第二行包含个整数,表示顶点的评估值。
接下来的行包含游戏树T的信息。
是顶点的子节点数量,是顶点的子节点的索引。
输入满足以下约束条件:
-
-
-
-
-
根节点的索引为1。
-
除了叶节点外,评估值始终为0。这并不意味着非叶节点的评估值为0,如果需要的话,你必须计算它们。
-
叶节点有时具有评估值为0的情况。
-
游戏树T是一棵树结构。
输出
打印最小评估次数和最大评估次数的叶节点。
请在最小值和最大值之间用空格分开。
最小值 最大值```
* * *
### 示例输入1
```plain
3
0 1 1
2 2 3
0
0
示例输入1的输出
2 2
示例输入2
8
0 0 100 100 0 -100 -100 -100
2 2 5
2 3 4
0
0
3 6 7 8
0
0
0
示例输入2的输出
3 5
示例输入3
8
0 0 100 100 0 100 100 100
2 2 5
2 3 4
0
0
3 6 7 8
0
0
0
示例输入3的输出
3 4
示例输入4
19
0 100 0 100 0 0 0 0 0 1 2 3 4 5 6 7 8 9 10
2 2 3
0
2 4 5
0
3 6 7 8
3 9 10 11
3 12 13 14
3 15 16 17
2 18 19
0
0
0
0
0
0
0
0
0
0
示例输入4的输出
7 12