codeforce1373D. Maximum Sum on Even Positions

この問題は本当かんたんです

一个数组,最多只能反转一次连续子数组,求偶数位和的最大值


难得能直接看出来的dp,感谢case提示的第二种反转方法
等数位板到了补图

#pragma GCC diagnostic error "-std=c++11"
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define Pair pair<int,int>
#define re return

#define getLen(name,index) name[index].size()
#define mem(a,b) memset(a,b,sizeof(a))
#define Make(a,b) make_pair(a,b)
#define Push(num) push_back(num)
#define rep(index,star,finish) for(register int index=star;index<finish;index++)
#define drep(index,finish,star) for(register int index=finish;index>=star;index--)
using namespace std;

template<class T> void _deb(const char *name,T val){
    cout<<name<<val<<endl;
}

const int maxn=2e5+10;

int t;
ll store[maxn];
ll dp[maxn][3];
int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    cin>>t;
    while(t--){
        int n;
        cin>>n;
        rep(i,0,n)
            cin>>store[i];
        store[n]=0;

        dp[0][0]=store[0],dp[0][1]=store[1],dp[0][2]=0;;
        rep(i,1,(n+1)/2){
            ll &oddNum=store[i*2+1],&evenNum=store[i*2];
            dp[i][0]=dp[i-1][0]+evenNum;
            dp[i][1]=max(dp[i-1][0]+oddNum,dp[i-1][1]+oddNum);
            dp[i][2]=max(dp[i-1][1]+evenNum,dp[i-1][2]+evenNum);
//            cout<<dp[i][0]<<"\t"<<dp[i][1]<<"\t"<<dp[i][2]<<endl;
        }
        ll ans=0;
        rep(i,0,3)
            ans=max(ans,dp[(n+1)/2-1][i]);

        dp[0][0]=store[0],dp[0][1]=0,dp[0][2]=0;;
        rep(i,1,(n+1)/2){
            ll &oddNum=store[i*2-1],&evenNum=store[i*2];
            dp[i][0]=dp[i-1][0]+evenNum;
            dp[i][1]=max(dp[i-1][0]+oddNum,dp[i-1][1]+oddNum);
            dp[i][2]=max(dp[i-1][1]+evenNum,dp[i-1][2]+evenNum);
//            cout<<dp[i][0]<<"\t"<<dp[i][1]<<"\t"<<dp[i][2]<<endl;
        }
        rep(i,0,3)
            ans=max(ans,dp[(n+1)/2-1][i]);

        cout<<ans<<endl;
    }

    re 0;
}

猜你喜欢

转载自blog.csdn.net/white_156/article/details/106985699