Related Articles
Longest dividing subsequence
• Difficulty Level : Hard
• Last Updated : 27 Dec, 2018

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

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

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++

 `/* Dynamic Programming C++ implementation of lds problem */` `#include  ` `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 = 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);  ` `    ``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 = 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 `

Output:

```Length of lds is 5
```

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

My Personal Notes arrow_drop_up
Recommended Articles
Page :