题意:
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;
}

本文介绍了一种解决环形数组中通过特定操作求最大值的算法。通过使用前缀和与后缀和的概念,结合三个循环进行动态规划,有效地解决了问题。代码使用C++实现,展示了如何初始化前缀和与后缀和数组,并通过迭代更新最大值。
739

被折叠的 条评论
为什么被折叠?



