Given an array arr of size N, and two integers A and B. The task is to find the length of the longest subsequence with the difference between adjacent elements as either A or B.
Example:
Input : arr[]={ 5, 5, 5, 10, 8, 6, 12, 13 }, A=0, B=1
Output : 4
Explanation : Maximum length subsequence is {5,5,5,6}
Input : arr[] = {4, 6, 7, 8, 9, 8, 12, 14, 17, 15}, A=2, B=1
Output : 6
Approach: On taking a closer look at the problem, the problem is similar to Longest Consecutive Subsequence. The only difference between them is now we have to count for the elements with differences A or B instead of 1. Now, to solve this problem, follow the below steps:
- Create a map, which will store each element as the key, and the length of the longest subsequence ending with arr[i] as the value.
- Now, traverse the array arr, and for each element arr[i]:
- Search for arr[i]-A, arr[i]+A, arr[i]-B, arr[i]+B in the map.
- If they are present find the maximum of all and +1 in that to get the maximum length of subsequence.
- Find the maximum value in the map, and return it as the answer
Below is the implementation of the above approach.
C++
#include <bits/stdc++.h>
using namespace std;
int maxSubsequence(vector< int >& arr, int A, int B)
{
int N = arr.size();
int ans = 1;
unordered_map< int , int > mp;
for ( int i = 0; i < N; ++i) {
int aa = 1;
if (mp.count(arr[i] - A)) {
aa = mp[arr[i] - A] + 1;
}
if (mp.count(arr[i] + A)) {
aa = max(aa, mp[arr[i] + A] + 1);
}
if (mp.count(arr[i] - B)) {
aa = max(aa, mp[arr[i] - B] + 1);
}
if (mp.count(arr[i] + B)) {
aa = max(aa, mp[arr[i] + B] + 1);
}
mp[arr[i]] = aa;
ans = max(ans, mp[arr[i]]);
}
return ans;
}
int main()
{
vector< int > arr = { 5, 5, 5, 10, 8, 6, 12, 13 };
int A = 0, B = 1;
cout << maxSubsequence(arr, A, B);
return 0;
}
|
Java
import java.util.*;
class GFG{
static int maxSubsequence( int []arr, int A, int B)
{
int N = arr.length;
int ans = 1 ;
HashMap<Integer,Integer> mp = new HashMap<Integer,Integer>();
for ( int i = 0 ; i < N; ++i) {
int aa = 1 ;
if (mp.containsKey(arr[i] - A)) {
aa = mp.get(arr[i] - A) + 1 ;
}
if (mp.containsKey(arr[i] + A)) {
aa = Math.max(aa, mp.get(arr[i] + A) + 1 );
}
if (mp.containsKey(arr[i] - B)) {
aa = Math.max(aa, mp.get(arr[i] - B) + 1 );
}
if (mp.containsKey(arr[i] + B)) {
aa = Math.max(aa, mp.get(arr[i] + B) + 1 );
}
mp.put(arr[i], aa);
ans = Math.max(ans, mp.get(arr[i]));
}
return ans;
}
public static void main(String[] args)
{
int []arr = { 5 , 5 , 5 , 10 , 8 , 6 , 12 , 13 };
int A = 0 , B = 1 ;
System.out.print(maxSubsequence(arr, A, B));
}
}
|
Python3
def maxSubsequence(arr, A, B):
N = len (arr)
ans = 1
mp = {}
for i in range ( 0 , N):
aa = 1
if ((arr[i] - A) in mp):
aa = mp[arr[i] - A] + 1
if ((arr[i] + A) in mp):
aa = max (aa, mp[arr[i] + A] + 1 )
if ((arr[i] - B) in mp):
aa = max (aa, mp[arr[i] - B] + 1 )
if ((arr[i] + B) in mp):
aa = max (aa, mp[arr[i] + B] + 1 )
mp[arr[i]] = aa
ans = max (ans, mp[arr[i]])
return ans
if __name__ = = "__main__" :
arr = [ 5 , 5 , 5 , 10 , 8 , 6 , 12 , 13 ]
A = 0
B = 1
print (maxSubsequence(arr, A, B))
|
C#
using System;
using System.Collections.Generic;
class GFG {
static int maxSubsequence( int [] arr, int A, int B)
{
int N = arr.Length;
int ans = 1;
Dictionary< int , int > mp
= new Dictionary< int , int >();
for ( int i = 0; i < N; ++i) {
int aa = 1;
if (mp.ContainsKey(arr[i] - A)) {
aa = mp[arr[i] - A] + 1;
}
if (mp.ContainsKey(arr[i] + A)) {
aa = Math.Max(aa, mp[arr[i] + A] + 1);
}
if (mp.ContainsKey(arr[i] - B)) {
aa = Math.Max(aa, mp[arr[i] - B] + 1);
}
if (mp.ContainsKey(arr[i] + B)) {
aa = Math.Max(aa, mp[arr[i] + B] + 1);
}
mp[arr[i]] = aa;
ans = Math.Max(ans, mp[arr[i]]);
}
return ans;
}
public static void Main( string [] args)
{
int [] arr = { 5, 5, 5, 10, 8, 6, 12, 13 };
int A = 0, B = 1;
Console.WriteLine(maxSubsequence(arr, A, B));
}
}
|
Javascript
<script>
function maxSubsequence(arr, A, B) {
let N = arr.length;
let ans = 1;
let mp = new Map();
for (let i = 0; i < N; ++i) {
let aa = 1;
if (mp.has(arr[i] - A)) {
aa = mp.get(arr[i] - A) + 1;
}
if (mp.has(arr[i] + A)) {
aa = Math.max(aa, mp.get(arr[i] + A) + 1);
}
if (mp.has(arr[i] - B)) {
aa = Math.max(aa, mp.get(arr[i] - B) + 1);
}
if (mp.has(arr[i] + B)) {
aa = Math.max(aa, mp.get(arr[i] + B) + 1);
}
mp.set(arr[i], aa);
ans = Math.max(ans, mp.get(arr[i]));
}
return ans;
}
let arr = [5, 5, 5, 10, 8, 6, 12, 13]
let A = 0, B = 1;
document.write(maxSubsequence(arr, A, B));
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(N)