Longest dividing subsequence
Last Updated :
28 May, 2021
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++
#include<bits/stdc++.h>
using namespace std;
int lds( int arr[], int n )
{
int lds[n];
lds[0] = 1;
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 *max_element(lds, lds+n);
}
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
import java.util.*;
import java.lang.*;
import java.io.*;
class GFG{
static int lds( Integer arr[], int n )
{
Integer lds[]= new Integer[n];
lds[ 0 ] = 1 ;
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 );
}
int max=( int )Collections.max(Arrays.asList(lds));
return max;
}
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
def lds(arr, n):
lds = [ 0 for i in range (n)]
lds[ 0 ] = 1
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)
arr = [ 2 , 11 , 16 , 12 , 36 , 60 , 71 , 17 ,
29 , 144 , 288 , 129 , 432 , 993 ]
print ( "Length of lds is" ,
lds(arr, len (arr)))
|
C#
using System;
using System.Linq;
public class GFG{
static int lds( int []arr, int n )
{
int []lds= new int [n];
lds[0] = 1;
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);
}
int max=lds.Max();
return max;
}
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 ) );
}
}
|
Javascript
<script>
function lds(arr,n)
{
let lds = new Array(n);
lds[0] = 1;
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);
}
let max=Math.max(...lds);
return max;
}
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 ) );
</script>
|
Output:
Length of lds is 5
Time Complexity: O(N*N )
Auxiliary Space: O(N)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...