Educational Codeforces Round 88 (Rated for Div. 2) D - Yet Another Yet Another Task dp

#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define ll long long
const int  maxn=1000005;
const int inf=0x3f3f3f3f;
using namespace std;
ll dp[maxn][2],ans,n,a[maxn];
int main()
{
    cin>>n;
    for(int i=1; i<=n; i++)
        cin>>a[i];
    //枚举要找的区间的最大数 
    for(int x=0; x<=30; x++)
    {
        for(int i=0; i<=n; i++)
            dp[i][0]=0,dp[i][1]=-inf;
        for(int i=1; i<=n; i++)
        {
            if(a[i]>x)
                continue;
            //不丢掉,说明小于x 
            dp[i][0]=max(dp[i-1][0]+a[i],0ll);
            //如果==x
            if(a[i]==x)
                //            丢这个数    前面已经丢过一个相同的 
                dp[i][1]=max(dp[i-1][0],dp[i-1][1]+a[i]);
            else
                dp[i][1]=dp[i-1][1]+a[i];//不等于的话,就直接加上 
        }
        for(int i=1; i<=n; i++)
            ans=max(ans,dp[i][1]);
    }
    printf("%lld\n",ans);
    return 0;
}

 

posted @ 2020-05-29 16:17  晴屿  阅读(155)  评论(0编辑  收藏  举报