2487 小b和环
- 2.0 秒
- 262,144.0 KB
- 20 分
- 3级题
小b有一个长度为n的环,每个点上有个数字。
现在请你选出一些点,满足选出的任意两个点在环上不相邻,且选出的点的数字之和最大,你只需输出这个最大值。
收起
输入
第一行输入一个数n,其中0<n≤50000; 第二行输入n个非负整数,第i个数表示环上顺时针第i个点上的数字,以空格隔开。 0<=每个点上的数字<=10000。
输出
输出一个数,表示最大值。
输入样例
4 1 2 3 1
输出样例
4
DP[I][J]代表第I个选不选,J为1时选,J为0时不选。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=50000+66;
const ll mod=1e9+7;
int n;
int a[maxn];
int dp[maxn][3];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
int ans=0;
//第1个不选,最后一个可选可不选
dp[2][1]=a[2];
dp[2][0]=0;
for(int i=3;i<=n;i++)
{
//第i个不选
dp[i][0]=max(max(dp[i-1][1],dp[i][0]),dp[i-1][0]);
//第i个选
dp[i][1]=max(dp[i][1],dp[i-1][0]+a[i]);
}
ans=max(dp[n][0],dp[n][1]);
memset(dp,0,sizeof(dp));
//第一个选择,最后一个必不选
dp[2][1]=dp[2][0]=a[1];
for(int i=3;i<=n;i++)
{
//第i个不选
dp[i][0]=max(max(dp[i-1][1],dp[i][0]),dp[i-1][0]);
//第i个选
dp[i][1]=max(dp[i][1],dp[i-1][0]+a[i]);
}
ans=max(ans,dp[n][0]);
printf("%d\n",ans);
}