1 条题解
-
0
分析
tag:DP
本质就是删除、、获得的价值,我们记录出现的最大数字,并且用数组存删掉的价值,从~进行,对于当前最优解有两种状态:删上一个或者删上上个,删上一个的最优解就是,删上上个的最优解就是 + ,状态转移如下:
- i < 2 :
- i >= 2:
参考代码
#include <bits/stdc++.h> using namespace std; const int N = 1e6 + 5; long long dp[N]; long long val[N]; int main() { int n; scanf("%d", & n); vector < int > elements(n); for (int i = 0; i < n; i++) { scanf("%d", & elements[i]); } int maxx = 0; for (auto it: elements) { val[it] += it; maxx = max(maxx, it); } long long ans = 0; for (int i = 1; i <= maxx; ++i) { dp[i] = max(dp[i - 1], (i < 2 ? 0 : dp[i - 2]) + val[i]); ans = max(ans, dp[i]); } printf("%lld\n", ans); return 0; }
- 1
信息
- ID
- 18
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 6
- 已通过
- 5
- 上传者