给定三个正整数n , k和x 。任务是计算大小为n的不同数组的数量,以使每个元素在1到k之间,并且两个连续的元素不同。同样,每个数组的第一个和最后一个元素应分别为1和x。
例子 :
Input : n = 4, k = 3, x = 2
Output : 3
这个想法是使用动态编程和组合学来解决这个问题。
首先,请注意,对于从2到k的所有x,答案都是相同的。这很容易证明。以后将很有用。
让状态f(i)表示填充数组A的范围[1,i]的方式数,以使A 1 = 1且A i ≠1。
因此,如果x≠1,则问题的答案为f(n)/(k – 1),因为f(n)是A n填充从2到k的数字的方式数,因此答案为所有这些值A n都相等,因此单个值的答案是f(n)/(k – 1)。
否则,如果x = 1,答案是F(N – 1),因为A N – 1≠1,唯一的编号,我们可以填补A N同为x = 1。
现在,主要问题是如何计算f(i)。考虑A i – 1可以是的所有数字。我们知道它必须位于[1,k]中。
- 如果A i – 1 ≠1,则存在(k – 2)f(i – 1)种方法来填充数组的其余部分,因为A i不能为1或A i – 1 (所以我们乘以(k – 2)),并且对于[1,i – 1]范围,递归地有f(i – 1)种方式。
- 如果A i – 1 = 1,则有(k – 1)f(i – 2)种方法填充数组的其余部分,因为A i – 1 = 1表示A i – 2 ≠1,这意味着有f(i – 2)只能填充[1,i – 2]范围,而A i不能为1的唯一值,因此我们有(k – 1)个A i选择。
通过结合以上内容,我们得到
f(i) = (k - 1) * f(i - 2) + (k - 2) * f(i - 1)
这将帮助我们使用f(i)进行动态编程。
下面是此方法的实现:
C++
// CPP Program to find count of arrays.
#include
#define MAXN 109
using namespace std;
// Return the number of arrays with given constartints.
int countarray(int n, int k, int x)
{
int dp[MAXN] = { 0 };
// Initalising dp[0] and dp[1].
dp[0] = 0;
dp[1] = 1;
// Computing f(i) for each 2 <= i <= n.
for (int i = 2; i < n; i++)
dp[i] = (k - 2) * dp[i - 1] +
(k - 1) * dp[i - 2];
return (x == 1 ? (k - 1) * dp[n - 2] : dp[n - 1]);
}
// Driven Program
int main()
{
int n = 4, k = 3, x = 2;
cout << countarray(n, k, x) << endl;
return 0;
}
Java
// Java program to find count of arrays.
import java.util.*;
class Counting
{
static int MAXN = 109;
public static int countarray(int n, int k,
int x)
{
int[] dp = new int[109];
// Initalising dp[0] and dp[1].
dp[0] = 0;
dp[1] = 1;
// Computing f(i) for each 2 <= i <= n.
for (int i = 2; i < n; i++)
dp[i] = (k - 2) * dp[i - 1] +
(k - 1) * dp[i - 2];
return (x == 1 ? (k - 1) * dp[n - 2] :
dp[n - 1]);
}
// driver code
public static void main(String[] args)
{
int n = 4, k = 3, x = 2;
System.out.println(countarray(n, k, x));
}
}
// This code is contributed by rishabh_jain
Python3
# Python3 code to find count of arrays.
# Return the number of lists with
# given constraints.
def countarray( n , k , x ):
dp = list()
# Initalising dp[0] and dp[1]
dp.append(0)
dp.append(1)
# Computing f(i) for each 2 <= i <= n.
i = 2
while i < n:
dp.append( (k - 2) * dp[i - 1] +
(k - 1) * dp[i - 2])
i = i + 1
return ( (k - 1) * dp[n - 2] if x == 1 else dp[n - 1])
# Driven code
n = 4
k = 3
x = 2
print(countarray(n, k, x))
# This code is contributed by "Sharad_Bhardwaj".
C#
// C# program to find count of arrays.
using System;
class GFG
{
// static int MAXN = 109;
public static int countarray(int n, int k,
int x)
{
int[] dp = new int[109];
// Initalising dp[0] and dp[1].
dp[0] = 0;
dp[1] = 1;
// Computing f(i) for each 2 <= i <= n.
for (int i = 2; i < n; i++)
dp[i] = (k - 2) * dp[i - 1] +
(k - 1) * dp[i - 2];
return (x == 1 ? (k - 1) * dp[n - 2] :
dp[n - 1]);
}
// Driver code
public static void Main()
{
int n = 4, k = 3, x = 2;
Console.WriteLine(countarray(n, k, x));
}
}
// This code is contributed by vt_m
PHP
Javascript
输出 :
3