题目链接:http://codeforces.com/contest/456/problem/C
解题报告:给出一个序列,然后选择其中的一个数 k 删除,删除的同时要把k - 1和k + 1也删除掉,同时总分数里面加上一个k,求最大的分数可以是多少?
dp题,递推公式是 dp[i] = max(dp[i-2]+num[i] * i,dp[i-1]); ,注意要用long long ,一开始没用WA了两发。
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<cmath> 6 #include<deque> 7 #include<queue> 8 #include<set> 9 #include<map> 10 using namespace std; 11 #define maxn 100005 12 #define LL long long 13 LL dp[maxn],num[maxn]; 14 15 int main() 16 { 17 int n; 18 while(scanf("%d",&n)!=EOF) 19 { 20 memset(num,0,sizeof(num)); 21 memset(dp,0,sizeof(dp)); 22 LL d,M = 0; 23 for(int i = 1;i <= n;++i) 24 { 25 scanf("%lld",&d); 26 M = max(M,d); 27 num[d]++; 28 } 29 dp[1] = num[1]; 30 for(int i = 2;i <= M;++i) 31 dp[i] = max(dp[i-2]+num[i] * i,dp[i-1]); 32 printf("%lld ",dp[M]); 33 } 34 return 0; 35 }