Contar secuencias de longitud dada que tienen sumas de prefijos no negativos que pueden generarse por valores dados

Dados dos enteros M y X , la tarea es encontrar el número de secuencias de longitud M que se pueden generar que comprendan X y -X de modo que sus respectivos recuentos sean iguales y el prefijo que suma a cada índice de la secuencia resultante no sea negativo _

Ejemplos:

Entrada: M = 4, X = 5
Salida: 2
Explicación:
Solo hay 2 secuencias posibles que tienen todas las sumas de prefijos posibles no negativas: 

  1. {+5, +5, -5, -5}
  2. {+5, -5, +5, -5}

Entrada: M = 6, X = 2
Salida: 5
Explicación:
Solo hay 5 secuencias posibles que tienen todas las sumas de prefijos posibles no negativas:

  1. {+2, +2, +2, -2, -2, -2}
  2. {+2, +2, -2, -2, +2, -2}
  3. {+2, -2, +2, -2, +2, -2}
  4. {+2, +2, -2, +2, -2, -2}
  5. {+2, -2, +2, +2, -2, -2}

Enfoque ingenuo : el enfoque más simple es generar todos los arreglos posibles de tamaño M con los números enteros +X y -X dados y encontrar la suma de prefijos de cada arreglo formado y contar aquellas secuencias cuya array de suma de prefijos tiene solo elementos no negativos. Imprima el recuento de dicha secuencia después de los pasos anteriores. 

Complejidad de tiempo: O((M*(M!))/((M/2)!) 2
Espacio auxiliar: O(M)

Enfoque eficiente : la idea es observar el patrón de que, para cualquier secuencia formada, el número de X positivas que se han producido en cada índice es siempre mayor o igual que el número de X negativas que se han producido. Esto es similar al patrón de los números catalanes . En este caso, compruebe que en cualquier punto el número de X positivas que se produjeron es siempre mayor o igual que el número de X negativas que se produjeron, que es el patrón de los números catalanes. Entonces, la tarea es encontrar el N- ésimo número catalán donde N = M/2 .

K_{N} = \frac{\binom{2N}{N}}{N + 1}        

donde, K N es N el Número Catalán y  \binom{2N}{N}    es el coeficiente binomial. 
 

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ program for the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the Binomial
// Coefficient C(n, r)
unsigned long int binCoff(unsigned int n,
                          unsigned int r)
{
    // Stores the value C(n, r)
    unsigned long int val = 1;
    int i;
 
    // Update C(n, r) = C(n, n - r)
    if (r > (n - r))
        r = (n - r);
 
    // Find C(n, r) iteratively
    for (i = 0; i < r; i++) {
        val *= (n - i);
        val /= (i + 1);
    }
 
    // Return the final value
    return val;
}
 
// Function to find number of sequence
// whose prefix sum at each index is
// always non-negative
void findWays(int M)
{
    // Find n
    int n = M / 2;
 
    unsigned long int a, b, ans;
 
    // Value of C(2n, n)
    a = binCoff(2 * n, n);
 
    // Catalan number
    b = a / (n + 1);
 
    // Print the answer
    cout << b;
}
 
// Driver Code
int main()
{
    // Given M and X
    int M = 4, X = 5;
 
    // Function Call
    findWays(M);
 
    return 0;
}

Java

// Java program for the above approach
import java.io.*;
 
class GFG{
 
// Function to find the Binomial
// Coefficient C(n, r)
static long binCoff(long n, long r)
{
     
    // Stores the value C(n, r)
    long val = 1;
    int i;
 
    // Update C(n, r) = C(n, n - r)
    if (r > (n - r))
        r = (n - r);
 
    // Find C(n, r) iteratively
    for(i = 0; i < r; i++)
    {
        val *= (n - i);
        val /= (i + 1);
    }
 
    // Return the final value
    return val;
}
 
// Function to find number of sequence
// whose prefix sum at each index is
// always non-negative
static void findWays(int M)
{
     
    // Find n
    int n = M / 2;
 
    long a, b, ans;
 
    // Value of C(2n, n)
    a = binCoff(2 * n, n);
 
    // Catalan number
    b = a / (n + 1);
 
    // Print the answer
    System.out.print(b);
}
 
// Driver Code
public static void main(String[] args)
{
 
    // Given M and X
    int M = 4, X = 5;
 
    // Function Call
    findWays(M);
}
}
 
// This code is contributed by akhilsaini

Python3

# Python3 program for the above approach
 
# Function to find the Binomial
# Coefficient C(n, r)
def binCoff(n, r):
 
    # Stores the value C(n, r)
    val = 1
 
    # Update C(n, r) = C(n, n - r)
    if (r > (n - r)):
        r = (n - r)
 
    # Find C(n, r) iteratively
    for i in range(0, r):
        val *= (n - i)
        val //= (i + 1)
 
    # Return the final value
    return val
 
# Function to find number of sequence
# whose prefix sum at each index is
# always non-negative
def findWays(M):
 
    # Find n
    n = M // 2
 
    # Value of C(2n, n)
    a = binCoff(2 * n, n)
 
    # Catalan number
    b = a // (n + 1)
 
    # Print the answer
    print(b)
 
# Driver Code
if __name__ == '__main__':
 
    # Given M and X
    M = 4
    X = 5
 
    # Function Call
    findWays(M)
 
# This code is contributed by akhilsaini

C#

// C# program for the above approach
using System;
 
class GFG{
 
// Function to find the Binomial
// Coefficient C(n, r)
static long binCoff(long n, long r)
{
     
    // Stores the value C(n, r)
    long val = 1;
    int i;
 
    // Update C(n, r) = C(n, n - r)
    if (r > (n - r))
        r = (n - r);
 
    // Find C(n, r) iteratively
    for(i = 0; i < r; i++)
    {
        val *= (n - i);
        val /= (i + 1);
    }
 
    // Return the final value
    return val;
}
 
// Function to find number of sequence
// whose prefix sum at each index is
// always non-negative
static void findWays(int M, int X)
{
     
    // Find n
    int n = M / 2;
 
    long a, b;
 
    // Value of C(2n, n)
    a = binCoff(2 * n, n);
 
    // Catalan number
    b = a / (n + 1);
 
    // Print the answer
    Console.WriteLine(b);
}
 
// Driver Code
public static void Main()
{
     
    // Given M and X
    int M = 4;
    int X = 5;
 
    // Function Call
    findWays(M, X);
}
}
 
// This code is contributed by akhilsaini

Javascript

<script>
// Javascript program to implement
// the above approach
 
// Function to find the Binomial
// Coefficient C(n, r)
function binCoff(n, r)
{
       
    // Stores the value C(n, r)
    let val = 1;
    let i;
   
    // Update C(n, r) = C(n, n - r)
    if (r > (n - r))
        r = (n - r);
   
    // Find C(n, r) iteratively
    for(i = 0; i < r; i++)
    {
        val *= (n - i);
        val /= (i + 1);
    }
   
    // Return the final value
    return val;
}
   
// Function to find number of sequence
// whose prefix sum at each index is
// always non-negative
function findWays(M)
{
       
    // Find n
    let n = M / 2;
   
    let a, b, ans;
   
    // Value of C(2n, n)
    a = binCoff(2 * n, n);
   
    // Catalan number
    b = a / (n + 1);
   
    // Print the answer
    document.write(b);
}
 
 
    // Driver Code
      
    // Given M and X
    let M = 4, X = 5;
   
    // Function Call
    findWays(M);
 
      
</script>
Producción: 

2

 

Tiempo Complejidad: O(M)
Espacio Auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por shashanktrivedi02 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *