Given an array A[] of size N, the task is to find the maximum sum of a subsequence such that for each pair present in the subsequence, the difference between their indices in the original array is equal to the difference between their values.
Examples:
Input: A[] = {10, 7, 1, 9, 10, 15}, N = 6
Output: 26
Explanation:
Subsequence: {7, 9, 10}.
Indices in the original array are {1, 3, 4} respectively.
Difference between their indices and values is equal for all pairs.
Hence, the maximum possible sum = (7 + 9 + 10) = 26.
Input: A[] = {100, 2}, N = 2
Output:100
Approach: For two elements having indices i and j, and values A[i] and A[j], if i – j is equal to A[i] – A[j], then A[i] – i is equal to A[j] – j. Therefore, the valid subsequence will have the same value of A[i] – i. Follow the steps below to solve the problem:
- Initialize a variable, say ans as 0, to store the maximum sum of a required subsequence possible.
- Initialize a map, say mp, to store the value for each A[i] – i.
- Iterate in the range [0, N – 1] using a variable, say i:
- Add A[i] to mp[A[i] – i].
- Update ans as the maximum of ans and mp[A[i] – i].
- Finally, print ans.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void maximumSubsequenceSum( int A[], int N)
{
int ans = 0;
map< int , int > mp;
for ( int i = 0; i < N; i++) {
mp[A[i] - i] += A[i];
ans = max(ans, mp[A[i] - i]);
}
cout << ans << endl;
}
int main()
{
int A[] = { 10, 7, 1, 9, 10, 1 };
int N = sizeof (A) / sizeof (A[0]);
maximumSubsequenceSum(A, N);
return 0;
}
|
Java
import java.util.HashMap;
public class GFG
{
static void maximumSubsequenceSum( int A[], int N)
{
int ans = 0 ;
HashMap<Integer, Integer> mp = new HashMap<>();
for ( int i = 0 ; i < N; i++) {
mp.put(A[i] - i,
mp.getOrDefault(A[i] - i, 0 ) + A[i]);
ans = Math.max(ans, mp.get(A[i] - i));
}
System.out.println(ans);
}
public static void main(String[] args)
{
int A[] = { 10 , 7 , 1 , 9 , 10 , 1 };
int N = A.length;
maximumSubsequenceSum(A, N);
}
}
|
Python3
def maximumSubsequenceSum(A, N):
ans = 0
mp = {}
for i in range (N):
if (A[i] - i in mp):
mp[A[i] - i] + = A[i]
else :
mp[A[i] - i] = A[i]
ans = max (ans, mp[A[i] - i])
print (ans)
if __name__ = = '__main__' :
A = [ 10 , 7 , 1 , 9 , 10 , 1 ]
N = len (A)
maximumSubsequenceSum(A, N)
|
C#
using System.Collections.Generic;
using System;
class GFG{
static void maximumSubsequenceSum( int []A, int N)
{
int ans = 0;
Dictionary< int ,
int > mp = new Dictionary< int ,
int >();
for ( int i = 0; i < N; i++)
{
if (mp.ContainsKey(A[i] - i))
mp[A[i] - i] += A[i];
else
mp[A[i] - i] = A[i];
ans = Math.Max(ans, mp[A[i] - i]);
}
Console.Write(ans);
}
public static void Main(String[] args)
{
int []A = { 10, 7, 1, 9, 10, 1 };
int N = A.Length;
maximumSubsequenceSum(A, N);
}
}
|
Javascript
<script>
function maximumSubsequenceSum(A, N)
{
var ans = 0;
var mp = new Map();
var i;
for (i = 0; i < N; i++) {
if (mp.has(A[i] - i))
mp.set(A[i] - i,mp.get(A[i] - i)+A[i]);
else
mp.set(A[i] - i,A[i]);
ans = Math.max(ans, mp.get(A[i] - i));
}
document.write(ans);
}
var A = [10, 7, 1, 9, 10, 1];
var N = A.length;
maximumSubsequenceSum(A, N);
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(N)