题意:
n个数字组成一个环,每次选择一个数字将其相邻的两个值赋给他,然后删除相邻的值,这样操作只剩一个值,求这个值的最大值。
思路:
利用三个循环来维护前缀和,分别利用b和c数组求得(不相邻的)前缀和及(不相邻的)后缀和。
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
typedef long long ll;
const int N=1e6+5;
const int mod=998244353;
const int inf=0x7fffffff;
const double pi=3.1415926535;
using namespace std;
int n,ans,a[N],b[N],c[N];
signed main()
{
IOS;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=0;i<n;i++)
{
if(i<2)
{
b[i]=a[i];
}
else
{
b[i]=a[i]+b[i-2];
}
}
for(int i=n-1; ~i;i--)
{
if(i>n-3)
{
c[i]=a[i];
}
else
{
c[i]=a[i]+c[i+2];
}
}
ans=b[0];
for(int i=0;i<n;i++)
{
ans=max(ans,b[i]+c[i+1]);
}
cout<<ans<<endl;
return 0;
}