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; }