测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A18276. 宝可梦

填空题 困难

题目描述

宝可梦

题目描述

你将按顺序遭遇 n 只宝可梦,第 i 只宝可梦的强度为 ai

对每只宝可梦,你可以选择将其放走或击败,收益规则如下:

  • 放走宝可梦:获得0点经验值。
  • 击败强度为x的宝可梦:基础获得x点经验值;若本次是你第偶数次击败宝可梦(第2次、第4次……),将额外获得x点经验值。

请计算你能获得的最大总经验值。

输入格式

第一行一个正整数n,表示宝可梦的总数量。

第二行n个正整数a1,a2,,,,,an,依次表示每只宝可梦的强度。

输出格式

输出一个整数,表示可获得的最大总经验值。

输入样例

5
1 5 3 2 7

输出样例

28

说明提示

- 1 ≤ n ≤ 2 *105 , - 1 ≤ ai ≤ 109

参考答案

#include <iostream> #include <algorithm> using namespace std; typedef long long ll; const ll INF = 1e18; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; ll dp0 = 0, dp1 = -INF; for (int i = 0; i < n; ++i) { ll x; cin >> x; ll nd0 = dp0, nd1 = dp1; // 不放走:原样继承 // 选择击败进行状态更新 nd0 = max(nd0, dp1 + 2 * x); nd1 = max(nd1, dp0 + x); dp0 = nd0; dp1 = nd1; } cout << max(dp0, dp1) << '\n'; return 0; }
上一题 下一题