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 }