有N只怪獸,第i只怪獸的體力為A[i],需要按編號從小到大的順序依次處理,對於每隻怪獸可以選擇打或不打,如果不打,經驗值不變;如果打,將獲得等同於怪獸體力的經驗值。另外,對於第偶數次打的怪獸,經驗值翻倍。求能獲得的最大經驗值。
1<=N<=2E5; 1<=A[i]<=1E9
分析:獲得的經驗跟奇偶性有關,設dp0[i]表示前i只怪獸打了偶數只的答案,dp1[i]表示前i只怪獸打了奇數只的答案。根據打或不打,以及奇偶性進行遞推。
#include <bits/stdc++.h>
using i64 = long long;
void solve() {
int N;
std::cin >> N;
std::vector<int> A(N+1);
for (int i = 1; i <= N; i++) {
std::cin >> A[i];
}
std::vector<i64> dp0(N+1), dp1(N+1);
dp0[0] = 0;
dp1[0] = -1E18;
for (int i = 1; i <= N; i++) {
dp0[i] = std::max(dp0[i-1], dp1[i-1] + 2 * A[i]);
dp1[i] = std::max(dp1[i-1], dp0[i-1] + A[i]);
}
std::cout << std::max(dp0[N], dp1[N]) << "\n";
}
int main() {
std::cin.tie(0)->sync_with_stdio(0);
int t = 1;
while (t--) solve();
return 0;
}