给出n个数,每次能够选择消除一个值为ai的数,那么全部ai-1。ai+1的数也会被消掉,同一时候会获得值ai,问最多能够获得多少?
看完题就可想到这应该是一个dp问题,首先,哈希一下,存下每一个数的个数放在p中,消除一个数i,会获得p[i]*i的值(由于能够消除p[i]次),假设从0的位置開始向右消去,那么,消除数i时,i-1可能选择了消除,也可能没有。假设消除了i-1,那么i值就已经不存在,dp[i] = dp[i-1]。假设没有被消除。那么dp[i] = dp[i-2]+ p[i]*i。
那么初始的dp[0] = 0 ; dp[1] = p[1] ;得到了公式 dp[i] = max(dp[i-1],dp[i-2]+p[i]*i).
#include <cstdio> #include <cstring> #include <algorithm> #define LL __int64 using namespace std; LL p[110000] , dp[110000] ; int main() { LL i , n , x , maxn = -1; memset(p,0,sizeof(p)); memset(dp,0,sizeof(dp)); scanf("%I64d", &n); for(i = 1 ; i <= n ; i++) { scanf("%I64d", &x); if(x > maxn) maxn = x ; p[x]++ ; } dp[1] = p[1] ; for(i = 2 ; i <= maxn ; i++) { dp[i] = max( dp[i-1],dp[i-2]+p[i]*i ); } printf("%I64d\n", dp[maxn]); return 0; }
本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5172894.html,如需转载请自行联系原作者