题解:AT_abc369_d [ABC369D] Bonus EXP
题目大意:
有 个怪物,每个怪物有一个战力值 ,你可以选择击败他或放走他,放走他没有经验值,击败他可以获得 的经验值,如果击败的数量是偶数,则还可以获得 的经验值,求最后能获得多少经验值。
分析
一眼 DP,按套路做。
定义状态:
:前 只怪物,选了奇数个怪物的最大经验值或选了偶数个怪物的最大经验值。
答案:
状态转移方程:
不选就是继承 ,选了就是在前 个中选了偶数个(因为选完这个变奇数了)的最大价值加上 ,即
最后就是
不选就是继承 ,选了就是在前 个中选了奇数个(因为选完这个变偶数了)的最大价值加上 ,即
最后就是
边界条件:
由于前 个不能选奇数个,所以
AC code
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=1e6+5;
int n,a[maxn],dp[maxn][2];
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
dp[0][0]=-1e18;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
dp[i][0]=max(dp[i-1][0],dp[i-1][1]+a[i]);
dp[i][1]=max(dp[i-1][1],dp[i-1][0]+2*a[i]);
}
cout<<max(dp[n][0],dp[n][1]);
return 0;
}
本人(KK_SpongeBob)蒟蒻,写不出好文章,但转载请注明原文链接:https://www.cnblogs.com/OIer-QAQ/p/18575246

浙公网安备 33010602011771号