【问题标题】:Count number of ways player 1 can win in a 2 player game计算玩家 1 在 2 人游戏中获胜的方式数
【发布时间】:2017-11-09 16:31:43
【问题描述】:

我遇到了以下问题,

2 名玩家玩游戏。在每一回合中,两名玩家都会获得 -x 到 +x 范围内的分数(均包括在内)。玩家 1 从分数 p1 开始,玩家 2 从分数 p2 开始。如果他们总共玩了 k 回合,请找出玩家 1 赢得游戏的方式的总数,即在 k 回合结束时,玩家 1 的得分比玩家 2 的多。

所以简而言之,我的理解是,我们需要找到 player1 和 player2 组合点的总数,使得(玩家 1 的点集总和)-(玩家 2 的点集总和)> = p2- p1+1

我不确定如何解决这个问题。请提出一种方法。提前致谢。

【问题讨论】:

    标签: algorithm


    【解决方案1】:

    递归地解决这个问题。使用您的变量,让我们看一下案例:让

    score_range = [-x : x]
    

    调用函数win_count

    基本情况,k==1

    如果k == 1,还需要转一圈。分数差是p2-p1。如果玩家 2 在本轮中得分 n2 分,则玩家 1 需要在本轮中至少获得 (p2 + n2) - p1 + 1 分。现在,p1, p2 in score_range 可以使用多少种组合?您可以直接从给定的整数中计算出来。

    将该计数作为函数值返回。

    递归情况,k > 1

    浏览本轮所有可能的分数。重复计算剩余游戏的可能性。

    count = 0
    for n1 in score_range
        for n2 in score_range
            count += win_count(p1+n1, p2+n2, k-1, x)
    

    你能从那里拿走吗?

    【讨论】:

    • 这个应该有dp公式吧?例如,我们也可以使用 0 到 2x 作为范围,而不是 -x 到 +x,最终答案应该仍然相同。我不完全确定要考虑哪些状态。它会是一个 3d 数组,一维用于回合,玩家 1 和 2 的分数各一个?
    • 干得好——当然还有 DP 改进。不要费心构建自己的;只需使用 @memoize 装饰器(您可以查找包)。该函数有四个参数,但其中一个是常量,因此将有三个用于记忆的活动键:p1, p2, k
    • 非常感谢您的解决方案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    • 2016-10-24
    • 1970-01-01
    相关资源
    最近更新 更多