Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Create boredom #266

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 68 additions & 0 deletions boredom
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
#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 (1 ≤ n ≤ 105) that shows how many numbers are in Alex's sequence.

The second line contains n integers a1, a2, ..., an (1 ≤ ai ≤ 105).

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;
}