codeforces455A Boredom (DP)

题目大意:给定一个序列,每次从序列中选中一个数ak,获得ak的得分,同时删除序列中所有的ak−1,ak+1,求最大得分。
题目

分析:

dp[i]表示以i结尾的最大得分。
那么dp[i]=max(dp[i-1],dp[i-2]+num[i]*i);
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
#define inf 0x3f3f3f3f
#define For(a,b) for(int a=0;a<b;a++)
#define mem(x) memset(x,0,sizeof(x))
#define Debug(x) cout<<"---> "<<x<<endl;
#define sf scanf
#define pf printf
int gcd(int a,int b){ return b>0?gcd(b,a%b):a;}
typedef long long ll;
typedef pair<int ,int > PII;
//head
#define maxn 300010
ll n,dp[maxn],A[maxn],num[maxn],Max=-inf;

int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>A[i];
        num[A[i]]++;
        Max=max(Max,A[i]);
    }
    dp[0]=0;
    dp[1]=num[1]*1;
    for(int i=2;i<=Max;i++){
        dp[i]=max(dp[i-1],dp[i-2]+num[i]*i);
    }
    cout<<dp[Max]<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37360631/article/details/81358699
今日推荐