Given an array arr[] of N elements. The task is to find the number of sub-sequences which have at least two consecutive elements such that absolute difference between them is ? 1.
Examples:
Input: arr[] = {1, 6, 2, 1}
Output: 6
{1, 2}, {1, 2, 1}, {2, 1}, {6, 2, 1}, {1, 1} and {1, 6, 2, 1}
are the sub-sequences that have at least one consecutive pair
with difference less than or equal to 1.Input: arr[] = {1, 6, 2, 1, 9}
Output: 12
Naive approach: The idea is to find all the possible sub-sequences and check if there exists a sub-sequence with any consecutive pair with difference ?1 and increase the count.
Efficient approach: The idea is to iterate over the given array and for each ith-element, try to find the required sub-sequence ending with ith element as its last element. 
For every i, we want to use arr[i], arr[i] -1, arr[i] + 1, so we will define 2D array, dp[][], where dp[i][0] will contain the number of sub sequence that do not have any consecutive pair with difference less than 1 and dp[i][1] contain the number of sub sequence having any consecutive pair with difference ?1. 
Also, we will maintain two variables required_subsequence and not_required_subsdequence to maintain the count of subsequences which have at least one consecutive element with difference ?1 and count of sub-sequences which do not contain any consecutive element pair with difference ?1.
Now, considering the sub-array arr[1] …. arr[i], we will perform the following steps:
- Compute the number of sub sequences which do not have any consecutive pair with difference less than 1 but will have by adding the ith element in the sub sequence. These are basically sum of dp[arr[i] + 1][0], dp[arr[i] – 1][0] and dp[arr[i]][0].
- Total number of subsequences have at least one consecutive pair with difference at least 1 and ending at i is equal to total sub-sequences found till i (just append arr[i] at the last) + subsequences which turns into subsequence have at least consecutive pair with difference less than 1 on adding arr[i].
- Total subsequence which do not have any consecutive pair with difference less than 1 and ending at i = total sub-sequence which do not have any consecutive pair with difference less than 1 before i + 1 (just the current element as a subsequence).
- Update required_sub-sequence, not_required_subsequence and dp[arr[i][0]] and the final answer will be required_subsequence.
Below is the implementation of the above approach:
C++
| // C++ implementation of the approach#include <bits/stdc++.h>usingnamespacestd;constintN = 10000;// Function to return the number of subsequences// which have at least one consecutive pair// with difference less than or equal to 1intcount_required_sequence(intn, intarr[]){    inttotal_required_subsequence = 0;    inttotal_n_required_subsequence = 0;    intdp[N][2];    for(inti = 0; i < n; i++) {        // Not required sub-sequences which        // turn required on adding i        intturn_required = 0;        for(intj = -1; j <= 1; j++)            turn_required += dp[arr[i] + j][0];        // Required sub-sequence till now will be        // required sequence plus sub-sequence        // which turns required        intrequired_end_i = (total_required_subsequence                              + turn_required);        // Similarly for not required        intn_required_end_i = (1 + total_n_required_subsequence                                - turn_required);        // Also updating total required and        // not required sub-sequences        total_required_subsequence += required_end_i;        total_n_required_subsequence += n_required_end_i;        // Also, storing values in dp        dp[arr[i]][1] += required_end_i;        dp[arr[i]][0] += n_required_end_i;    }    returntotal_required_subsequence;}// Driver codeintmain(){    intarr[] = { 1, 6, 2, 1, 9 };    intn = sizeof(arr) / sizeof(int);    cout << count_required_sequence(n, arr) << "\n";    return0;} | 
Java
| // Java implementation of above approachpublicclassGFG{    staticintN = 10000;// Function to return the number of subsequences// which have at least one consecutive pair// with difference less than or equal to 1staticintcount_required_sequence(intn, intarr[]){    inttotal_required_subsequence = 0;    inttotal_n_required_subsequence = 0;    int[][]dp = newint[N][2];    for(inti = 0; i < n; i++)     {        // Not required sub-sequences which        // turn required on adding i        intturn_required = 0;        for(intj = -1; j <= 1; j++)            turn_required += dp[arr[i] + j][0];        // Required sub-sequence till now will be        // required sequence plus sub-sequence        // which turns required        intrequired_end_i = (total_required_subsequence                            + turn_required);        // Similarly for not required        intn_required_end_i = (1+ total_n_required_subsequence                                - turn_required);        // Also updating total required and        // not required sub-sequences        total_required_subsequence += required_end_i;        total_n_required_subsequence += n_required_end_i;        // Also, storing values in dp        dp[arr[i]][1] += required_end_i;        dp[arr[i]][0] += n_required_end_i;    }    returntotal_required_subsequence;}// Driver codepublicstaticvoidmain(String[] args) {    intarr[] = { 1, 6, 2, 1, 9};    intn = arr.length;    System.out.println(count_required_sequence(n, arr));}}// This code has been contributed by 29AjayKumar | 
Python3
| # Python3 implementation of the approach importnumpy as np;N =10000; # Function to return the number of subsequences # which have at least one consecutive pair # with difference less than or equal to 1 defcount_required_sequence(n, arr) :        total_required_subsequence =0;     total_n_required_subsequence =0;     dp =np.zeros((N,2));         fori inrange(n) :        # Not required sub-sequences which         # turn required on adding i         turn_required =0;         forj inrange(-1, 2,1) :            turn_required +=dp[arr[i] +j][0];         # Required sub-sequence till now will be         # required sequence plus sub-sequence         # which turns required         required_end_i =(total_required_subsequence                             +turn_required);         # Similarly for not required         n_required_end_i =(1+total_n_required_subsequence                                 -turn_required);         # Also updating total required and         # not required sub-sequences         total_required_subsequence +=required_end_i;         total_n_required_subsequence +=n_required_end_i;         # Also, storing values in dp         dp[arr[i]][1] +=required_end_i;         dp[arr[i]][0] +=n_required_end_i;             returntotal_required_subsequence; # Driver code if__name__ =="__main__":     arr =[ 1, 6, 2, 1, 9];     n =len(arr);     print(count_required_sequence(n, arr)) ; # This code is contributed by AnkitRai01 | 
C#
| usingSystem;publicclassGFG{        staticintN = 10000; // Function to return the number of subsequences// which have at least one consecutive pair// with difference less than or equal to 1staticintcount_required_sequence(intn, int[] arr){    inttotal_required_subsequence = 0;    inttotal_n_required_subsequence = 0;    int[,]dp = newint[N,2];    for(inti = 0; i < n; i++)    {         // Not required sub-sequences which        // turn required on adding i        intturn_required = 0;        for(intj = -1; j <= 1; j++)            turn_required += dp[arr[i] + j,0];         // Required sub-sequence till now will be        // required sequence plus sub-sequence        // which turns required        intrequired_end_i = (total_required_subsequence                            + turn_required);         // Similarly for not required        intn_required_end_i = (1 + total_n_required_subsequence                                - turn_required);         // Also updating total required and        // not required sub-sequences        total_required_subsequence += required_end_i;        total_n_required_subsequence += n_required_end_i;         // Also, storing values in dp        dp[arr[i],1] += required_end_i;        dp[arr[i],0] += n_required_end_i;    }     returntotal_required_subsequence;} // Driver code    staticpublicvoidMain ()    {                int[] arr = { 1, 6, 2, 1, 9 };        intn = arr.Length;             Console.WriteLine(count_required_sequence(n, arr));            }}// This code is contributed by rag2127. | 
Javascript
| <script>// Javascript implementation of the approachvarN = 10000;// Function to return the number of subsequences// which have at least one consecutive pair// with difference less than or equal to 1functioncount_required_sequence(n, arr){    vartotal_required_subsequence = 0;    vartotal_n_required_subsequence = 0;    vardp = Array.from(Array(N), ()=> Array(2).fill(0));    for(vari = 0; i < n; i++) {        // Not required sub-sequences which        // turn required on adding i        varturn_required = 0;        for(varj = -1; j <= 1; j++)            turn_required += dp[arr[i] + j][0];        // Required sub-sequence till now will be        // required sequence plus sub-sequence        // which turns required        varrequired_end_i = (total_required_subsequence                              + turn_required);        // Similarly for not required        varn_required_end_i = (1 + total_n_required_subsequence                                - turn_required);        // Also updating total required and        // not required sub-sequences        total_required_subsequence += required_end_i;        total_n_required_subsequence += n_required_end_i;        // Also, storing values in dp        dp[arr[i]][1] += required_end_i;        dp[arr[i]][0] += n_required_end_i;    }    returntotal_required_subsequence;}// Driver codevararr = [ 1, 6, 2, 1, 9 ];varn = arr.length;document.write( count_required_sequence(n, arr) + "<br>");</script> | 
12
Time Complexity: O(N), where N represents the size of the given array.
Auxiliary Space: O(N), where N represents the size of the given array.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!


 
                                    







