上海市计算机学会竞赛平台2022年4月月赛丙组圆环独立集(一)
题目描述
给定一个长度为 nn 的环状数列 a1,a2,⋯ ,ana1,a2,⋯,an,请从中间挑选出一些数字组成一个独立集,使得该独立集中的数字之和达到最大。
所谓环状,是指在考虑相邻关系时,需要把 a1a1 和 anan 也看做是一对邻居。所谓独立集,就是挑选出的数字在原来的圆环上不能相邻。
输入格式
- 第一行:单个整数表示 nn。
- 第二行:nn 个整数表示 a1,a2,⋯ ,ana1,a2,⋯,an。
输出格式
- 单个整数:表示独立集的数字之和的最大值。
数据范围
- 对于 30%30% 的数据,1≤n≤201≤n≤20;
- 对于 60%60% 的数据,1≤n≤50001≤n≤5000;
- 对于 100%100% 的数据,1≤n≤500,0001≤n≤500,000,
- 1≤ai≤1,000,0001≤ai≤1,000,000。
样例数据
输入:
5
1 1 1 1 1
输出:
2
输入:
6
100 1 1 100 1 1
输出:
200
说明:
这个例子告诉我们最优独立集不一定是最大独立集
详见代码:
#include<bits/stdc++.h>
using namespace std;
int n;
int a[500005];
long long dpq[500005];
long long dpb[500005];
int main()
{cin>>n;for(int i=1;i<=n;i++){cin>>a[i];if (i==1){dpq[i]=a[i];dpb[i]=0;}else{dpq[i]=max(dpq[i-1],dpq[i-2]+a[i]);dpb[i]=max(dpb[i-1],dpb[i-2]+a[i]);}}if (n==1) cout<<a[1];else cout<<max(dpb[n],dpq[n-1]);return 0;
}