给定三个整数R , B和W ,分别表示奔跑,球和小门的数目。在板球比赛中,单个球可以得分0、1、2、3、4、6或小门。任务是计算团队最多得分W的B球准确得分R的方式。由于方法的数量很大,因此请打印答案模1000000007 。
例子:
Input: R = 4, B = 2, W = 2
Output: 7
The 7 ways are:
0, 4
4, 0
Wicket, 4
4, Wicket
1, 3
3, 1
2, 2
Input: R = 40, B = 10, W = 4
Output: 653263
方法:可以使用动态编程和组合技术解决问题。重复发生将有6种状态,我们首先从运行= 0 ,球= 0和检票口= 0开始。这些状态将是:
- 如果一个团队在一个球中得分为1,则奔跑=奔跑+ 1 ,球=球+ 1 。
- 如果一支球队的得分是2,那么球=球+ 2 ,球=球+ 1 。
- 如果一支球队的得分是3 ,则球=球+ 3 ,球=球+ 1 。
- 如果一支球队得分为4,则一个球=奔跑=奔跑+ 4 ,球=球+ 1 。
- 如果一支球队得分为6 ,则球=球+ 6 ,球=球+ 1 。
- 如果一支球队没有得分,则没有球,则奔跑=奔跑,球=球+ 1 。
- 如果一个团队在一个球上丢掉1个小门,那么奔跑=奔跑,小球=球+ 1 ,小门=小门+ 1 。
DP将包含三个状态,运行状态最多为6 * Balls ,因为它是最大可能的状态。因此, dp [i] [j] [k]表示在失去k个小门的情况下,可以准确地在j个球中对i进行得分的方式数。
下面是上述方法的实现:
C++
// C++ implementation of the approach
#include
using namespace std;
#define mod 1000000007
#define RUNMAX 300
#define BALLMAX 50
#define WICKETMAX 10
// Function to return the number of ways
// to score R runs in B balls with
// at most W wickets
int CountWays(int r, int b, int l, int R, int B, int W,
int dp[RUNMAX][BALLMAX][WICKETMAX])
{
// If the wickets lost are more
if (l > W)
return 0;
// If runs scored are more
if (r > R)
return 0;
// If condition is met
if (b == B && r == R)
return 1;
// If no run got scored
if (b == B)
return 0;
// Already visited state
if (dp[r][b][l] != -1)
return dp[r][b][l];
int ans = 0;
// If scored 0 run
ans += CountWays(r, b + 1, l, R, B, W, dp);
ans = ans % mod;
// If scored 1 run
ans += CountWays(r + 1, b + 1, l, R, B, W, dp);
ans = ans % mod;
// If scored 2 runs
ans += CountWays(r + 2, b + 1, l, R, B, W, dp);
ans = ans % mod;
// If scored 3 runs
ans += CountWays(r + 3, b + 1, l, R, B, W, dp);
ans = ans % mod;
// If scored 4 runs
ans += CountWays(r + 4, b + 1, l, R, B, W, dp);
ans = ans % mod;
// If scored 6 runs
ans += CountWays(r + 6, b + 1, l, R, B, W, dp);
ans = ans % mod;
// If scored no run and lost a wicket
ans += CountWays(r, b + 1, l + 1, R, B, W, dp);
ans = ans % mod;
// Memoize and return
return dp[r][b][l] = ans;
}
// Driver code
int main()
{
int R = 40, B = 10, W = 4;
int dp[RUNMAX][BALLMAX][WICKETMAX];
memset(dp, -1, sizeof dp);
cout << CountWays(0, 0, 0, R, B, W, dp);
return 0;
}
Java
// Java implementation of the approach
class GFG
{
static int mod = 1000000007;
static int RUNMAX = 300;
static int BALLMAX = 50;
static int WICKETMAX = 10;
// Function to return the number of ways
// to score R runs in B balls with
// at most W wickets
static int CountWays(int r, int b, int l,
int R, int B, int W,
int [][][]dp)
{
// If the wickets lost are more
if (l > W)
return 0;
// If runs scored are more
if (r > R)
return 0;
// If condition is met
if (b == B && r == R)
return 1;
// If no run got scored
if (b == B)
return 0;
// Already visited state
if (dp[r][b][l] != -1)
return dp[r][b][l];
int ans = 0;
// If scored 0 run
ans += CountWays(r, b + 1, l, R, B, W, dp);
ans = ans % mod;
// If scored 1 run
ans += CountWays(r + 1, b + 1, l, R, B, W, dp);
ans = ans % mod;
// If scored 2 runs
ans += CountWays(r + 2, b + 1, l, R, B, W, dp);
ans = ans % mod;
// If scored 3 runs
ans += CountWays(r + 3, b + 1, l, R, B, W, dp);
ans = ans % mod;
// If scored 4 runs
ans += CountWays(r + 4, b + 1, l, R, B, W, dp);
ans = ans % mod;
// If scored 6 runs
ans += CountWays(r + 6, b + 1, l, R, B, W, dp);
ans = ans % mod;
// If scored no run and lost a wicket
ans += CountWays(r, b + 1, l + 1, R, B, W, dp);
ans = ans % mod;
// Memoize and return
return dp[r][b][l] = ans;
}
// Driver code
public static void main(String[] args)
{
int R = 40, B = 10, W = 4;
int[][][] dp = new int[RUNMAX][BALLMAX][WICKETMAX];
for(int i = 0; i < RUNMAX;i++)
for(int j = 0; j < BALLMAX; j++)
for(int k = 0; k < WICKETMAX; k++)
dp[i][j][k]=-1;
System.out.println(CountWays(0, 0, 0, R, B, W, dp));
}
}
// This code has been contributed by 29AjayKumar
Python3
# Python3 implementation of the approach
mod = 1000000007
RUNMAX = 300
BALLMAX = 50
WICKETMAX = 10
# Function to return the number of ways
# to score R runs in B balls with
# at most W wickets
def CountWays(r, b, l, R, B, W, dp):
# If the wickets lost are more
if (l > W):
return 0;
# If runs scored are more
if (r > R):
return 0;
# If condition is met
if (b == B and r == R):
return 1;
# If no run got scored
if (b == B):
return 0;
# Already visited state
if (dp[r][b][l] != -1):
return dp[r][b][l]
ans = 0;
# If scored 0 run
ans += CountWays(r, b + 1, l,
R, B, W, dp);
ans = ans % mod;
# If scored 1 run
ans += CountWays(r + 1, b + 1, l,
R, B, W, dp);
ans = ans % mod;
# If scored 2 runs
ans += CountWays(r + 2, b + 1, l,
R, B, W, dp);
ans = ans % mod;
# If scored 3 runs
ans += CountWays(r + 3, b + 1, l,
R, B, W, dp);
ans = ans % mod;
# If scored 4 runs
ans += CountWays(r + 4, b + 1, l,
R, B, W, dp);
ans = ans % mod;
# If scored 6 runs
ans += CountWays(r + 6, b + 1, l,
R, B, W, dp);
ans = ans % mod;
# If scored no run and lost a wicket
ans += CountWays(r, b + 1, l + 1,
R, B, W, dp);
ans = ans % mod;
# Memoize and return
dp[r][b][l] = ans
return ans;
# Driver code
if __name__=="__main__":
R = 40
B = 10
W = 40
dp = [[[-1 for k in range(WICKETMAX)]
for j in range(BALLMAX)]
for i in range(RUNMAX)]
print(CountWays(0, 0, 0, R, B, W, dp))
# This code is contributed by rutvik_56
C#
// C# implementation of the approach
using System;
using System.Collections.Generic;
using System.Linq;
class GFG
{
static int mod = 1000000007;
static int RUNMAX = 300;
static int BALLMAX = 50;
static int WICKETMAX = 10;
// Function to return the number of ways
// to score R runs in B balls with
// at most W wickets
static int CountWays(int r, int b, int l,
int R, int B, int W,
int [,,]dp)
{
// If the wickets lost are more
if (l > W)
return 0;
// If runs scored are more
if (r > R)
return 0;
// If condition is met
if (b == B && r == R)
return 1;
// If no run got scored
if (b == B)
return 0;
// Already visited state
if (dp[r, b, l] != -1)
return dp[r, b, l];
int ans = 0;
// If scored 0 run
ans += CountWays(r, b + 1, l, R, B, W, dp);
ans = ans % mod;
// If scored 1 run
ans += CountWays(r + 1, b + 1, l, R, B, W, dp);
ans = ans % mod;
// If scored 2 runs
ans += CountWays(r + 2, b + 1, l, R, B, W, dp);
ans = ans % mod;
// If scored 3 runs
ans += CountWays(r + 3, b + 1, l, R, B, W, dp);
ans = ans % mod;
// If scored 4 runs
ans += CountWays(r + 4, b + 1, l, R, B, W, dp);
ans = ans % mod;
// If scored 6 runs
ans += CountWays(r + 6, b + 1, l, R, B, W, dp);
ans = ans % mod;
// If scored no run and lost a wicket
ans += CountWays(r, b + 1, l + 1, R, B, W, dp);
ans = ans % mod;
// Memoize and return
return dp[r, b, l] = ans;
}
// Driver code
static void Main()
{
int R = 40, B = 10, W = 4;
int[,,] dp = new int[RUNMAX, BALLMAX, WICKETMAX];
for(int i = 0; i < RUNMAX;i++)
for(int j = 0; j < BALLMAX; j++)
for(int k = 0; k < WICKETMAX; k++)
dp[i, j, k]=-1;
Console.WriteLine(CountWays(0, 0, 0, R, B, W, dp));
}
}
// This code is contributed by mits
输出:
653263