我的
目录
【abc369d】Bonus EXP
【题目描述】
有n只怪物依次排开,你需要从第一个怪物开始依次攻打。
对于第i只怪物,你有两种选择:
1. 放走这只怪物,你将获得0的经验。
2. 击败这只怪物,你将获得a[i]的经验。如果这是你击败的第偶数只怪物,你将额外再获得a[i]的经验。
求你最多能够获得多少经验。
【输入格式】
第一行一个数n。
第二行n个数,表示a[i]。
【输出格式】
一个整数表示你的答案。
【样例输入1】
5
1 5 3 2 7
【样例输出1】
28
【样例输入2】
2
1000000000 1000000000
【样例输出2】
3000000000
【提示】
对于样例1,击败第1,2,3,5四只怪物,获得1+5*2+3+2*7=28经验。
【数据规模】
1≤n≤200000。1≤a[i]≤109。
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,i,dp[200100][3],a[200010];
main(){
ios::sync_with_stdio(false);
cin.tie(NULL);cout.tie(NULL);
cin>>n;
for(i=1;i<=n;i++)cin>>a[i];
dp[1][1]=a[1];
for(i=2;i<=n;i++)
dp[i][1]=max(dp[i-1][1],dp[i-1][0]+a[i]),dp[i][0]=max(dp[i-1][0],dp[i-1][1]+a[i]*2);
cout<<max(dp[n][1],dp[n][0]);
}
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,i,dp[200100][3],a[200010];
main(){
ios::sync_with_stdio(false);
cin.tie(NULL);cout.tie(NULL);
cin>>n;
for(i=1;i<=n;i++)cin>>a[i];
dp[1][1]=a[1];
for(i=2;i<=n;i++)
dp[i][1]=max(dp[i-1][1],dp[i-1][0]+a[i]),dp[i][0]=max(dp[i-1][0],dp[i-1][1]+a[i]*2);
cout<<max(dp[n][1],dp[n][0]);
}