Codeforces Round #260 (Div. 2) C. Boredom

来源:互联网 发布:侧卧按键开关封装淘宝 编辑:程序博客网 时间:2024/05/21 19:05

统计每个数字出现的次数,然后从前往后dp;

其中dp[i][0]表示到第i个为止并且选择第i个能得到的最大值;

dp[i][1] 表示到第i个为止并且不选择第i个能得到的最大值;

最终结果取max(dp[manx][0],dp[maxn][1]);

#include<cstdio>#include<cstring>#include<cmath>#include<climits>#include<cctype>#include<cstdlib>#include<iostream>#include<algorithm>#include<queue>#include<vector>#include<map>#include<set>#include<string>#include<stack>#define ll __int64 #define MAX 100010#define INF INT_MAX#define eps 1e-8using namespace std;ll a[MAX],dp[MAX][2];int main(){ll n;while (scanf("%I64d",&n) != EOF){memset(a,0,sizeof(a));ll t,maxn = 0;http://codeforces.com/contests/455,456for (int i = 0; i<n; i++){scanf("%I64d",&t);maxn = max(maxn,t);a[t]++;}memset(dp,0,sizeof(dp));for (int i=1; i<=maxn; i++){if (a[i] == 0){dp[i][0] = max(dp[i-1][0],dp[i-1][1]);dp[i][1] = max(dp[i-1][0],dp[i-1][1]);continue;}if (a[i-1] == 0){dp[i][0] = max(dp[i-1][0],dp[i-1][1]) + a[i]*i;dp[i][1] = max(dp[i-1][0],dp[i-1][1]);continue;}dp[i][0] = dp[i-1][1] + a[i]*i;dp[i][1] = max(dp[i-1][0],dp[i-1][1]);}printf("%I64d\n",max(dp[maxn][0],dp[maxn][1]));}return 0;}


0 0