题意:
从n个数中选出一个数 x,得到x的奖励,但是要去掉所有值为x-1和x+1的数,当所有的数都取光的时候求得到最大的奖励
分析:
很裸的一个DP
dp[i]=max(dp[i-1],dp[i-2]+num[i]*i) 表示取值为i的时候所能得到的最大奖励。
CODE
#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#define LL long long
using namespace std;
LL ls[110000];
LL dp[110000];
int main()
{
int n;
while(~scanf("%d",&n))
{
memset(ls,0,sizeof(ls));
int i;
LL maxn = 0;
for(i = 0; i < n; i++)
{
LL key;
cin>>key;
ls[key]++;
if(key >maxn)
maxn = key;
}
dp[1] = ls[1];
for(i = 2; i <= maxn; i++)
{
dp[i] = max(dp[i-1],dp[i-2]+i*ls[i]);
}
printf("%lld\n",dp[maxn]);
}
return 0;
}
794

被折叠的 条评论
为什么被折叠?



