sdut 1483 红色警戒之CZ的复仇 夜

http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1483

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
#include<cmath>
#define LL long long

using namespace std;
const int N=100005;
LL a[N],l1[N],l2[N],r1[N],r2[N];
int main()
{
    //freopen("data.in","r",stdin);
    int n;
    while(cin>>n)
    {
        for(int i=1;i<n;++i)
        cin>>a[i];
        l1[0]=r1[0]=l1[n]=r1[n]=0;
        l2[0]=r2[0]=l2[n]=r2[n]=0;
        for(int i=1;i<n;++i)
        {
            if(a[i]%2==1)
            {
                l1[i]=a[i]+max(l1[i-1],l2[i-1]);
                if(a[i]>=2)
                l2[i]=a[i]+l2[i-1]-1;
                else
                l2[i]=0;
            }
            else
            {
                if(a[i]>0)
                l1[i]=a[i]+max(l1[i-1],l2[i-1])-1;
                else
                l1[i]=0;
                if(a[i]>=2)
                l2[i]=a[i]+l2[i-1];
                else
                l2[i]=0;
            }
        }
        for(int i=n-1;i>=1;--i)
        {
            if(a[i]%2==1)
            {
                r1[i]=a[i]+max(r1[i+1],r2[i+1]);
                if(a[i]>=2)
                r2[i]=a[i]+r2[i+1]-1;
                else
                r2[i]=0;
            }
            else
            {
                if(a[i]>0)
                r1[i]=a[i]+max(r1[i+1],r2[i+1])-1;
                else
                r1[i]=0;
                if(a[i]>=2)
                r2[i]=a[i]+r2[i+1];
                else
                r2[i]=0;
            }
        }
        LL ans=0;
        for(int i=0;i<n;++i)
        ans=max(ans,max(l1[i],l2[i])+max(r1[i+1],r2[i+1]));
        cout<<ans<<endl;
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/liulangye/p/2923653.html