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;

}

  

你可能感兴趣的:(du)