Count of AP (Arithmetic Progression) Subsequences in an array - GeeksforGeeks

21 May, 2021
Given an array of n positive integers. The task is to count the number of Arithmetic Progression subsequence in the array. Note: Empty sequence or single element sequence is Arithmetic Progression. 1 <= arr[i] <= 1000000.Examples:  
Input : arr[] = { 1, 2, 3 }
Output : 8
Arithmetic Progression subsequence from the 
given array are: {}, { 1 }, { 2 }, { 3 }, { 1, 2 },
{ 2, 3 }, { 1, 3 }, { 1, 2, 3 }.

Input : arr[] = { 10, 20, 30, 45 }
Output : 12

Input : arr[] = { 1, 2, 3, 4, 5 }
Output : 23
 
Since empty sequence and single element sequence is also arithmetic progression, so we initialize the answer with n(number of element in the array) + 1. Now, we need to find the arithmetic progression subsequence of length greater than or equal to 2. Let minimum and maximum of the array be minarr and maxarr respectively. Observe, in all the arithmetic progression subsequences, the range of common difference will be from (minarr – maxarr) to (maxarr – minarr). Now, for each common difference, say d, calculate the subsequence of length greater than or equal to 2 using dynamic programming. Let dp[i] be the number of subsequence that end with arr[i] and have common difference of d. So,  
The number of subsequence of length greater than or equal to 2 with common difference d is sum of dp[i] – 1, 0 <= i = 2 with difference d. To speed up, store the sum of dp[j] with arr[j] + d = arr[i] and j < i.Below is implementation of above idea : 
C++
Java
Python3
C#
Javascript
// C++ program to find number of AP// subsequences in the given array#include<bits/stdc++.h>#define MAX 1000001using namespace std; int numofAP(int a[], int n){    // initializing the minimum value and    // maximum value of the array.    int minarr = INT_MAX, maxarr = INT_MIN;     // Finding the minimum and maximum    // value of the array.    for (int i = 0; i < n; i++)    {        minarr = min(minarr, a[i]);        maxarr = max(maxarr, a[i]);    }     // dp[i] is going to store count of APs ending    // with arr[i].    // sum[j] is going to store sun of all dp[]'s    // with j as an AP element.    int dp[n], sum[MAX];     // Initialize answer with n + 1 as single elements    // and empty array are also DP.    int ans = n + 1;     // Traversing with all common difference.    for (int d=(minarr-maxarr); d<=(maxarr-minarr); d++)    {        memset(sum, 0, sizeof sum);         // Traversing all the element of the array.        for (int i = 0; i < n; i++)        {            // Initialize dp[i] = 1.            dp[i] = 1;             // Adding counts of APs with given differences            // and a[i] is last element.             // We consider all APs where an array element            // is previous element of AP with a particular            // difference            if (a[i] - d >= 1 && a[i] - d <= 1000000)                dp[i] += sum[a[i] - d];             ans += dp[i] - 1;            sum[a[i]] += dp[i];        }    }     return ans;} // Driver codeint main(){    int arr[] = { 1, 2, 3 };    int n = sizeof(arr)/sizeof(arr[0]);    cout << numofAP(arr, n) << endl;    return 0;}
// Java program to find number of AP// subsequences in the given arrayimport java.util.Arrays; class GFG {         static final int MAX = 1000001;     static int numofAP(int a[], int n)    {                 // initializing the minimum value and        // maximum value of the array.        int minarr = +2147483647;        int maxarr = -2147483648;         // Finding the minimum and maximum        // value of the array.        for (int i = 0; i < n; i++) {            minarr = Math.min(minarr, a[i]);            maxarr = Math.max(maxarr, a[i]);        }         // dp[i] is going to store count of        // APs ending with arr[i].        // sum[j] is going to store sun of        // all dp[]'s with j as an AP element.        int dp[] = new int[n];        int sum[] = new int[MAX];         // Initialize answer with n + 1 as        // single elements and empty array        // are also DP.        int ans = n + 1;         // Traversing with all common        // difference.        for (int d = (minarr - maxarr);                d <= (maxarr - minarr); d++)        {            Arrays.fill(sum, 0);             // Traversing all the element            // of the array.            for (int i = 0; i < n; i++) {                                 // Initialize dp[i] = 1.                dp[i] = 1;                 // Adding counts of APs with                // given differences and a[i]                // is last element.                // We consider all APs where                // an array element is previous                // element of AP with a particular                // difference                if (a[i] - d >= 1 &&                             a[i] - d <= 1000000)                    dp[i] += sum[a[i] - d];                 ans += dp[i] - 1;                sum[a[i]] += dp[i];            }        }         return ans;    }         // Driver code    public static void main(String[] args)    {        int arr[] = { 1, 2, 3 };        int n = arr.length;                 System.out.println(numofAP(arr, n));    }} // This code is contributed by Anant Agarwal.
# Python program to find number of AP# subsequences in the given array MAX = 1000001 def numofAP(a, n):     # initializing the minimum value and    # maximum value of the array.    minarr = +2147483647    maxarr = -2147483648     # Finding the minimum and    # maximum value of the array.    for i in range(n):        minarr = min(minarr, a[i])        maxarr = max(maxarr, a[i])          # dp[i] is going to store count of APs ending    # with arr[i].    # sum[j] is going to store sun of all dp[]'s    # with j as an AP element.    dp = [0 for i in range(n + 1)]          # Initialize answer with n + 1 as single    # elements and empty array are also DP.    ans = n + 1     # Traversing with all common difference.    for d in range((minarr - maxarr), (maxarr - minarr) + 1):        sum = [0 for i in range(MAX + 1)]                 # Traversing all the element of the array.        for i in range(n):                     # Initialize dp[i] = 1.            dp[i] = 1             # Adding counts of APs with given differences            # and a[i] is last element.            # We consider all APs where an array element            # is previous element of AP with a particular            # difference            if (a[i] - d >= 1 and a[i] - d <= 1000000):                dp[i] += sum[a[i] - d]             ans += dp[i] - 1            sum[a[i]] += dp[i]     return ans # Driver codearr = [ 1, 2, 3 ]n = len(arr) print(numofAP(arr, n)) # This code is contributed by Anant Agarwal.
// C# program to find number of AP// subsequences in the given arrayusing System; class GFG {         static int MAX = 1000001;     // Function to find number of AP    // subsequences in the given array    static int numofAP(int []a, int n)    {                 // initializing the minimum value and        // maximum value of the array.        int minarr = +2147483647;        int maxarr = -2147483648;        int i;                 // Finding the minimum and maximum        // value of the array.        for (i = 0; i < n; i++)        {            minarr = Math.Min(minarr, a[i]);            maxarr = Math.Max(maxarr, a[i]);        }         // dp[i] is going to store count of        // APs ending with arr[i].        // sum[j] is going to store sun of        // all dp[]'s with j as an AP element.        int []dp = new int[n];        int []sum = new int[MAX];         // Initialize answer with n + 1 as        // single elements and empty array        // are also DP.        int ans = n + 1;         // Traversing with all common        // difference.        for (int d = (minarr - maxarr);                 d <= (maxarr - minarr); d++)        {                         for(i = 0; i < MAX; i++)            sum[i]= 0;                     // Traversing all the element            // of the array.            for ( i = 0; i < n; i++)            {                                 // Initialize dp[i] = 1.                dp[i] = 1;                 // Adding counts of APs with                // given differences and a[i]                // is last element.                // We consider all APs where                // an array element is previous                // element of AP with a particular                // difference                if (a[i] - d >= 1 &&                    a[i] - d <= 1000000)                    dp[i] += sum[a[i] - d];                 ans += dp[i] - 1;                sum[a[i]] += dp[i];            }        }         return ans;    }         // Driver code    public static void Main()    {        int []arr = {1, 2, 3};        int n = arr.Length;                 Console.WriteLine(numofAP(arr, n));    }} // This code is contributed by vt_m.
<script>    // Javascript program to find number of AP    // subsequences in the given array         let MAX = 1000001;       function numofAP(a, n)    {                   // initializing the minimum value and        // maximum value of the array.        let minarr = +2147483647;        let maxarr = -2147483648;           // Finding the minimum and maximum        // value of the array.        for (let i = 0; i < n; i++) {            minarr = Math.min(minarr, a[i]);            maxarr = Math.max(maxarr, a[i]);        }           // dp[i] is going to store count of        // APs ending with arr[i].        // sum[j] is going to store sun of        // all dp[]'s with j as an AP element.        let dp = new Array(n);        let sum = new Array(MAX);           // Initialize answer with n + 1 as        // single elements and empty array        // are also DP.        let ans = n + 1;           // Traversing with all common        // difference.        for (let d = (minarr - maxarr);                d <= (maxarr - minarr); d++)        {            sum.fill(0);               // Traversing all the element            // of the array.            for (let i = 0; i < n; i++) {                                   // Initialize dp[i] = 1.                dp[i] = 1;                   // Adding counts of APs with                // given differences and a[i]                // is last element.                // We consider all APs where                // an array element is previous                // element of AP with a particular                // difference                if (a[i] - d >= 1 &&                             a[i] - d <= 1000000)                    dp[i] += sum[a[i] - d];                   ans += dp[i] - 1;                sum[a[i]] += dp[i];            }        }           return ans;    }         let arr = [ 1, 2, 3 ];    let n = arr.length;     document.write(numofAP(arr, n));     </script>
Output :  
8
This article is contributed by Anuj Chauhan. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. 
vt_m
mukesh07
arithmetic progression
Dynamic Programming
Dynamic Programming
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Bellman–Ford Algorithm | DP-23
Floyd Warshall Algorithm | DP-16
Matrix Chain Multiplication | DP-8
Travelling Salesman Problem | Set 1 (Naive and Dynamic Programming)
Subset Sum Problem | DP-25
Longest Palindromic Substring | Set 1
Coin Change | DP-7
Sieve of Eratosthenes
Overlapping Subproblems Property in Dynamic Programming | DP-1
Edit Distance | DP-5