dp[i][0][0]从第i个点往左走不回来可获得的最大价值
dp[i][0][1]从第i个点往左走回来可获得的最大价值
dp[i][1][0]从第i个点往右走不回来可获得的最大价值
dp[i][1][1]从第i个点往右走回来可获得的最大价值
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
#define maxn 100009
using namespace std;
__int64 dp[maxn][2][2],a[maxn];
int n;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n-1;i++)
scanf("%I64d",&a[i]);
for(int i=n-1;i>=1;i--)
{
dp[i][1][0]=(a[i]-1)/2*2+1+max(dp[i+1][1][0],dp[i+1][1][1]);
if(a[i]>=2)
{
dp[i][1][1]=(a[i]-2)/2*2+2+dp[i+1][1][1];
}
else
{
dp[i][1][1]=0;
}
}
for(int i=2;i<=n;i++)
{
dp[i][0][0]=(a[i-1]-1)/2*2+1+max(dp[i-1][0][0],dp[i-1][0][1]);
if(a[i-1]>=2)
{
dp[i][0][1]=(a[i-1]-2)/2*2+2+dp[i-1][0][1];
}
else
{
dp[i][0][1]=0;
}
}
__int64 ans=0;
for(int i=1;i<=n;i++)
{
ans=max(ans,dp[i][0][0]);
ans=max(ans,dp[i][1][0]);
ans=max(ans,dp[i][0][1]+dp[i][1][0]);
ans=max(ans,dp[i][1][1]+dp[i][0][0]);
ans=max(ans,dp[i][0][1]+dp[i][1][1]);
}
printf("%I64d\n",ans);
//system("pause");
return 0;
}