Longest dividing subsequence

You are given an array A of size N. Your task is to find the length of largest dividing sub sequence.A dividing sequence is a sequence a1, a2, …, aN where ai divides aj whenever i < j. For example, 3, 15, 60, 720 is a dividing sequence.
input-
The first line of each test case is N, where N is the size of array.
The second line of each test case contains N space separated integers which is the input for the array.
Output-
the length of largest dividing sub sequence
examples:

Input : arr[] = {2 11 16 12 36 60 71 17 29 144 288 129 432 993}
Output : 5
2 12 36 144 288 is dividing sub sequence of largest size

Input : 1 2 4 8 16
Output : 5
Whole sequence is dividing

This problem is simply a variation of Longest Increasing Subsequence. We can solve this using Dynamic Programming. The idea is to find the longest dividing subsequence ending with every element and finally return maximum of all.

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

/* 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; 

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

/* 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 ) ); 
}

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

/* 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

chevron_right


Output:

Length of lds is 5


My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.