重叠集算法

时间:2014-12-04 17:37:13

标签: java algorithm

有一个由N轮组成的游戏。每轮结束后,获胜者(您或我)将获得一分。在比赛结束时获得更多积分的玩家获胜。

你希望在游戏的每一轮之后,你得到的分数至少是我的M倍。

For Example N=3 , M=1
the possible sequence of winners of rounds are:
DDD     // D is you and M is me
DMD
DDM

MDD    // Is not possible as you are having 1 point and i am having zero so condition violted 

我的方法:

在特定的游戏中,只有两种可能性是你赢了或我赢了,所以我做了一个递归调用来计算两种可能性的分数。

                                   D           
                                M           D          // At M+1 game(M wins or D wins)
                              D or M      D or M       // At M+2 game(M wins or D wins)
                    .
                    .
                    . ans so on
                                 At last round return 1

代码:

public static int score(int rounds, int m, int score1, int current, int score2) {
    int sum=0;

    if (current == rounds && score2 == 0) return 1;
    if (current == rounds && score1 / score2 >= m) return 1;
    if (score2 != 0 && score1 / score2 < m) return 0;
    if (score2 == 0 || score1 / score2 >= m) {
        sum += score(rounds, m, score1, current + 1, score2 + 1);
        sum += score(rounds, m, score1 + 1, current + 1, score2);
    }
    return sum;
}

System.out.println(score(rounds,m,m,m,0));



该解决方案需要很长时间才能在10 ^ 6的范围内获得更大的N值。我怎样才能加快进度。

1 个答案:

答案 0 :(得分:0)

假设您要打N场比赛(按顺序)并且在每一步都记录玩家A是赢还是玩家B获胜。你生成一个看起来像AABABBAABA等的序列。你想要计算这样的序列的数量,其中A的数量是B的M倍(我假设你的意思至少是M次的M倍)。由于N是固定的,因此B的数量有一个上限。即#B's + #A's = N且#A's&gt; = M * #B's,所以(M + 1)* #B's&lt; = N,所以#B's&lt; = N /(M + 1)。

让我们说,你可以在字符串中最多拥有K B(并且总共有N个字符)。对于每个1&lt; = k&lt; = K,有N选择k种方式来放置B(假设你有k个),其余的是A的。总而言之,存在SUM(k = 0..K)(N选择k)这样的可能性。

因此,不要使用代码生成所有这些代码,只需让代码计算(N选择k)值并将它们相加。