Subsecuencia divisoria más larga

Se le da una array A de tamaño N. Su tarea es encontrar la longitud de la subsecuencia divisoria más grande. Una secuencia divisoria es una secuencia a1, a2, …, aN donde ai divide aj siempre que i < j. Por ejemplo, 3, 15, 60, 720 es una secuencia divisoria. 
input: 
la primera línea de cada caso de prueba es N, donde N es el tamaño de la array. 
La segunda línea de cada caso de prueba contiene N enteros separados por espacios, que es la entrada para la array. 
Salida: 
la longitud de los ejemplos de subsecuencias divisorias más grandes 
:

Entrada: arr[] = {2 11 16 12 36 60 71 17 29 144 288 129 432 993} Salida 
: 5 
2 12 36 144 288 está dividiendo la subsecuencia de mayor tamaño
Entrada: 1 2 4 8 16 
Salida: 5 
Toda la secuencia es divisor

Este problema es simplemente una variación de la subsecuencia creciente más larga . Podemos resolver esto usando Programación Dinámica. La idea es encontrar la subsecuencia divisoria más larga que termine con cada elemento y finalmente devolver el máximo de todos.  

C++

/* Dynamic Programming C++ implementation of lds problem */
#include<bits/stdc++.h>
using namespace std;
   
/* lds() returns the length of the longest dividing
  subsequence in arr[] of size n */
int lds( int arr[], int n )
{
    int lds[n];
  
    lds[0] = 1;  
 
    /* Compute optimized lds values in bottom up manner */
    for (int i = 1; i < n; i++ )
    {
        lds[i] = 1;
        for (int j = 0; j < i; j++ ) 
            if (lds[j] != 0 && arr[i] % arr[j] == 0)
                lds[i] = max(lds[i], lds[j] + 1);
    }
 
    // Return maximum value in lds[]
    return *max_element(lds, lds+n);
}
   
/* Driver program to test above function */
int main()
{
    int arr[] = { 2, 11, 16, 12, 36, 60, 71, 17,
                     29, 144, 288, 129, 432, 993};
    int n = sizeof(arr)/sizeof(arr[0]);
    printf("Length of lds is %d\n", lds( arr, n ) );
    return 0;
}

Java

/* Dynamic Programming Java implementation of lds problem */
 
import java.util.*;
import java.lang.*;
import java.io.*;
 
class GFG{
/* lds() returns the length of the longest dividing
  subsequence in arr[] of size n */
static int lds( Integer arr[], int n )
{
    Integer lds[]=new Integer[n];
   
    lds[0] = 1;  
  
    /* Compute optimized lds values in bottom up manner */
    for (int i = 1; i < n; i++ )
    {
        lds[i] = 1;
        for (int j = 0; j < i; j++ ) 
            if (lds[j] != 0 && arr[i] % arr[j] == 0)
                lds[i] = Math.max(lds[i], lds[j] + 1);
    }
  
    // Return maximum value in lds[]
    int max=(int)Collections.max(Arrays.asList(lds));
    return max;
}
    
/* Driver program to test above function */
public static void main(String args[])
{
    Integer arr[] = { 2, 11, 16, 12, 36, 60, 71, 17,
                     29, 144, 288, 129, 432, 993};
    int n =arr.length ;
    System.out.println("Length of lds is "+lds( arr, n ) );
}
}

Python3

# Dynamic Programming Python3
# implementation of lds problem
 
# lds() returns the length of the longest
# dividing subsequence in arr[] of size n
def lds(arr, n):
     
    lds = [0 for i in range(n)]
     
    lds[0] = 1
     
    # Compute optimized lds values
    # in bottom up manner
    for i in range(n):
        lds[i] = 1
        for j in range(i):
            if (lds[j] != 0 and
                arr[i] % arr[j] == 0):
                lds[i] = max(lds[i], lds[j] + 1)
 
    return max(lds)
 
# Driver Code
arr = [2, 11, 16, 12, 36, 60, 71, 17,
         29, 144, 288, 129, 432, 993]
 
print("Length of lds is",
       lds(arr, len(arr)))
 
# This code is contributed
# by Mohit Kumar

C#

/* Dynamic Programming C# implementation of lds problem */
using System;
using System.Linq;
public class GFG{
    /* lds() returns the length of the longest dividing
      subsequence in arr[] of size n */
    static int lds( int []arr, int n )
    {
        int []lds=new int[n];
 
        lds[0] = 1;  
 
        /* Compute optimized lds values in bottom up manner */
        for (int i = 1; i < n; i++ )
        {
            lds[i] = 1;
            for (int j = 0; j < i; j++ ) 
                if (lds[j] != 0 && arr[i] % arr[j] == 0)
                    lds[i] = Math.Max(lds[i], lds[j] + 1);
        }
 
        // Return maximum value in lds[]
        int max=lds.Max();
        return max;
    }
 
    /* Driver program to test above function */
    public static void Main()
    {
        int []arr = { 2, 11, 16, 12, 36, 60, 71, 17,
                         29, 144, 288, 129, 432, 993};
        int n =arr.Length ;
        Console.Write("Length of lds is "+lds( arr, n ) );
    }
}
 
// This code is contributed by 29AjayKumar

Javascript

<script>
/* Dynamic Programming Javascript implementation of lds problem */
 
/* lds() returns the length of the longest dividing
  subsequence in arr[] of size n */
function lds(arr,n)
{
    let lds = new Array(n);
    lds[0] = 1; 
   
    /* Compute optimized lds values in bottom up manner */
    for (let i = 1; i < n; i++ )
    {
        lds[i] = 1;
        for (let j = 0; j < i; j++ )
            if (lds[j] != 0 && arr[i] % arr[j] == 0)
                lds[i] = Math.max(lds[i], lds[j] + 1);
    }
   
    // Return maximum value in lds[]
    let max=Math.max(...lds);
    return max;
}
 
/* Driver program to test above function */
let arr=[2, 11, 16, 12, 36, 60, 71, 17,
                     29, 144, 288, 129, 432, 993];
                      
let n =arr.length ;
document.write("Length of lds is "+lds( arr, n ) );
 
// This code is contributed by unknown2108
</script>
Producción: 

Length of lds is 5

 

Complejidad de tiempo: O(N*N )

Espacio Auxiliar: O(N)

Publicación traducida automáticamente

Artículo escrito por ANKITKUMAR34 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 *