cf455a(简单dp)

题意:给出一个长度为n的数列,元素为a1, a2, ...an;删除ai,ai+1,ai-1 可以得到ai积分,输出最多可以得到多少积分;

题解:开一个数组a存取数列,a[i]表示元素i的个数,所以删除i可以得到a[i]*i积分;

i可以选择删除或者不删除,dp[i]表示i删除或不删除时的总积分, 如果i-1删除,则i必定删除;

若i不删除,则dp[i]=dp[i-1];

若i删除,则dp[i]=dp[i-2]+a[i]*i;

由此可得动态转移方程式:dp[i]=max(dp[i]=dp[i-1],dp[i]=dp[i-2]+a[i]*i);

代码如下:

 1 #include <bits/stdc++.h>
 2 #define MAXN 100000+10
 3 using namespace std;
 4 
 5 int main(void)
 6 {
 7     int n, Max=0;
 8     long long a[MAXN], dp[MAXN];
 9     memset(a, 0, sizeof(a));
10     memset(dp, 0, sizeof(dp));
11     cin >> n;
12     for(int i=0; i<n; i++)
13     {
14         int x;
15         cin >> x;
16         if(x>Max)  Max=x;
17         a[x]++;
18     }
19     for(int i=1; i<=Max; i++)
20     dp[i]=max(dp[i-1], dp[i-2]+a[i]*i);
21     cout << dp[Max] <<  endl;
22     return 0;
23 }
原文地址:https://www.cnblogs.com/geloutingyu/p/5746642.html