四个男孩正在玩带球游戏。在每个回合中,玩家(当前拥有球)将其随机传递给其他玩家。鲍勃总是开始游戏。任务是找出N传球后球将以多少种方式回到鲍勃。
例子:
Input: N = 3
Output: 6
Here are all the possible ways:
Bob -> Boy1 -> Boy2 -> Bob
Bob -> Boy1 -> Boy3 -> Bob
Bob -> Boy2 -> Boy1 -> Bob
Bob -> Boy2 -> Boy3 -> Bob
Bob -> Boy3 -> Boy1 -> Bob
Bob -> Boy3 -> Boy2 -> Bob
Input: N = 10
Output: 14763
方法:让N次传回后回到Bob的序列数为P(N) 。有两种情况,要么将N – 2传递给Bob,要么不传递给Bob。请注意,鲍勃不能有球在(N – 1)次传球,因为那时他不会有在N球传个。
- 情况1:如果N – 2传递给Bob,则N – 1传递可以传递给其他3个男孩中的任何一个。因此,此类序列的数量为3 * P(N – 2) 。
- 情况2:如果传球N – 2不传给鲍勃,那么传球N – 1是传给鲍勃以外的2个男孩之一,以及将球传到手中的那个男孩。因此,用鲍勃代替N-1的接收者,并获得唯一的N-1序列。因此,此类序列的数量为2 * P(N – 1) 。
因此,递归关系将为P(N)= 2 * P(N – 1)+ 3 * P(N – 2) ,其中P(0)= 1且P(1)= 0 。
求解递归关系后, P(N)=(3 N + 3 *(-1 N ))/ 4
下面是上述方法的实现:
C++
// Function to return the number of
// sequences that get back to Bob
#include
using namespace std;
int numSeq(int n)
{
return (pow(3, n) + 3 * pow(-1, n)) / 4;
}
// Driver code
int main()
{
int N = 10;
printf("%d", numSeq(N));
return 0;
}
// This code is contributed by Mohit kumar
Java
// Function to return the number of
// sequences that get back to Bob
import java.util.*;
class GFG
{
static int numSeq(int n)
{
return (int) ((Math.pow(3, n) + 3 *
Math.pow(-1, n)) / 4);
}
// Driver code
public static void main(String[] args)
{
int N = 10;
System.out.printf("%d", numSeq(N));
}
}
// This code is contributed by Rajput-Ji
Python3
# Function to return the number of
# sequences that get back to Bob
def numSeq(n):
return (pow(3, n) + 3 * pow(-1, n))//4
# Driver code
N = 10
print(numSeq(N))
C#
// C# implementation of the above approach
using System;
// Function to return the number of
// sequences that get back to Bob
class GFG
{
static int numSeq(int n)
{
return (int) ((Math.Pow(3, n) + 3 *
Math.Pow(-1, n)) / 4);
}
// Driver code
public static void Main()
{
int N = 10;
Console.WriteLine(numSeq(N));
}
}
// This code is contributed by AnkitRai01
Javascript
输出:
14763