abc369D Bonus EXP

chenfy27發表於2024-10-07

有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;
}

相關文章