题意:给出一个长度为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);
代码如下:
#include <bits/stdc++.h>
#define MAXN 100000+10
using namespace std;
int main(void)
{
int n, Max=0;
long long a[MAXN], dp[MAXN];
memset(a, 0, sizeof(a));
memset(dp, 0, sizeof(dp));
cin >> n;
for(int i=0; i<n; i++)
{
int x;
cin >> x;
if(x>Max) Max=x;
a[x]++;
}
for(int i=1; i<=Max; i++)
dp[i]=max(dp[i-1], dp[i-2]+a[i]*i);
cout << dp[Max] << endl;
return 0;
}
时间: 2024-10-02 05:41:14