Codeforces Round #750 E

E. Pchelyonok and Segments

题链
我们可以发现答案最多是sqrt(2n)个 也就是500个
考虑dp
dp[i][j]表示前i个 分成了j段 且第j段的max
转移就是
dp[i][j]=max{dp[i][j],s[i]-s[i-j]}[dp[i-j][j-1]>s[i]-s[i-j]]

int dp[100010][510];
void solve(){
    int n;cin>>n;
    vector<int>a(n);
    for(int i=0;i<n;i++)cin>>a[i];
    reverse(all(a));
    a.push_back(0);
    for(int i=n;i>=1;i--)a[i]=a[i-1];
    a[0]=0;
    vector<int>s(n+1);
    for(int i=1;i<=n;i++)s[i]=s[i-1]+a[i];
    //dp[i][j]表示前i个数分了j段且第j段的max
    int ans=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=(int)sqrt(2*n);j++){
            dp[i][j]=dp[i-1][j];
            if(i>=j&&(s[i]-s[i-j]<dp[i-j][j-1]||j==1))
                dp[i][j]=max(dp[i][j],s[i]-s[i-j]);
            if(dp[i][j])ans=max(ans,j);
        }
    }
    cout<<ans<<endl;
}
posted @ 2023-01-03 15:52  ycllz  阅读(27)  评论(0)    收藏  举报