石油网站编辑怎么做,网站开发维护费用,wordpress 计算程序,义乌外贸网站建设行吗题目描述
给定一个长度为 nn 的环状数列 a1,a2,⋯ ,ana1,a2,⋯,an#xff0c;请从中间挑选出一些数字组成一个独立集#xff0c;使得该独立集中的数字之和达到最大。
所谓环状#xff0c;是指在考虑相邻关系时#xff0c;需要把 a1a1 和 anan 也看做是一对邻居…题目描述
给定一个长度为 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,0001≤ai≤1,000,0001≤ai≤1,000,000。
样例数据
输入:
5 1 1 1 1 1
输出:
2
输入:
6 100 1 1 100 1 1
输出:
200
说明:
这个例子告诉我们最优独立集不一定是最大独立集
详见代码
#includebits/stdc.h
using namespace std;
int n;
int a[500005];
long long dpq[500005];
long long dpb[500005];
int main()
{cinn;for(int i1;in;i){cina[i];if (i1){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 (n1) couta[1];else coutmax(dpb[n],dpq[n-1]);return 0;
}