题意:给出一个长度为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 }