455/A. Boredom

codeforces百题计划第一周(2)

线性dp,记录每个数次出现的次数b[i],dp[i]的状态是处理完前i个数字后的最大值。

转移方程:dp[i]=max(dp[i-1],dp[i-2]*i*b[i])

注意会爆int

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int maxn=1e5+5;
 5 long long  a[maxn];
 6 long long  b[maxn];
 7 long long  dp[maxn]; 
 8 int main(){
 9     int n;
10     cin>>n;
11     for(int i=1;i<=n;i++){
12         cin>>a[i];
13         b[a[i]]++;
14     }
15     //操作了前i后的最好结果 
16     dp[1]=b[1];
17     //cout <<b[100000]<<endl;
18     for(int i=2;i<=100000;i++)
19     {
20         dp[i]=max(dp[i-1],dp[i-2]+(i*b[i])); 
21         //cout <<dp[i]<<endl;
22     }
23     cout <<dp[100000]<<endl;
24     
25     return 0;
26 }     

 

posted @ 2019-08-06 09:46  Chuhanjing  阅读(226)  评论(0编辑  收藏  举报