动态规划问题。
先做一个哈希,统计一下每个点数的个数p[i]。
dp[i]表示到i为止得到的最大点数
递推关系:
1.选择 i :选 i 就不能选择 i -1 , dp[i] = dp[i-2] + p[i] * i;
2.不选择 i : dp[i] = dp[i-1];
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 100005;
ll p[maxn],dp[maxn];
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;
}
本文深入探讨了动态规划在解决复杂问题时的作用,并通过一个具体的实例展示了如何使用动态规划来优化解决方案。主要内容包括理解动态规划的基本概念,构建哈希表进行数据统计,以及通过递归关系计算最大点数。此外,提供了详细的代码实现步骤,便于读者实践。
1837

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



