interactive-coding-challenges/boredom
Ankit Srivastava bb3de8206e
Create boredom
2019-10-22 21:35:16 +05:30

69 lines
2.0 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#FAMOUS DP PROBLEM WITH EXPLANATION FOR BEGGINNERS
A. Boredom
time limit per test1 second
memory limit per test256 megabytes
inputstandard input
outputstandard output
Alex doesn't like boredom. That's why whenever he gets bored, he comes up with games. One long winter evening he came up with a game and decided to play it.
Given a sequence a consisting of n integers. The player can make several steps. In a single step he can choose an element of the sequence (let's denote it ak) and delete it, at that all elements equal to ak+1 and ak-1 also must be deleted from the sequence. That step brings ak points to the player.
Alex is a perfectionist, so he decided to get as many points as possible. Help him.
Input
The first line contains integer n (1n105) that shows how many numbers are in Alex's sequence.
The second line contains n integers a1, a2, ..., an (1ai105).
Output
Print a single integer — the maximum number of points that Alex can earn.
Examples
inputCopy
2
1 2
outputCopy
2
inputCopy
3
1 2 3
outputCopy
4
inputCopy
9
1 2 1 3 2 2 2 2 3
outputCopy
10
Note
Consider the third test example. At first step we need to choose any element equal to 2. After that step our sequence looks like this [2,2,2,2]. Then we do 4 steps, on each step we choose any element equals to 2. In total we earn 10 points.
SOLUTION :-
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,x;
cin>>n;
long long int a[100005]={0};
long long int dp[100005]={0};
for(int i=0;i<n;i++)
{
cin>>x;
a[x]++;// cREATING A FREQUENCY ARRAY USING ITS INDEX AS NUMBERS
}
dp[0]=0; //if INPUT ARRAY ONLY HAS 0
dp[1]=a[1];//if input ARRAY ONLY HAS 0 AND 1'S
for(int i=2;i<=100000;i++)
{
dp[i]=max(dp[i-1],dp[i-2]+(i*a[i]));//IF NOT TAKING ELMENT THEN TAKE THE PREVIOUS ONE
//ELSE TAKE THE PREVIOUS TO PREVIOUS AND ADD THE FREQ OF PRESENT ELEMENT
}
/* for(int i=0;i<=1000;i++)
{
cout<<dp[i]<<" ";
}
cout<<endl;*/
cout<< dp[100000]<<endl;
}