📌  相关文章
📜  具有不同值的连续元素的数组计数

📅  最后修改于: 2021-09-22 10:17:04             🧑  作者: Mango

给定三个正整数nkx 。任务是计算可以形成大小为 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,我们可以用 x = 1 填充 A n的唯一数字。

现在,主要问题是如何计算 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 };
 
    // Initialising 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];
 
        // Initialising 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()
     
    # Initialising 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];
 
        // Initialising 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

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程