Increase Subarray Sums

原题链接

题解

观察数据范围,看到 \(n<=5000\) 便确定了 \(O(n^2)\) 左右的算法,这样一来我可以遍历所有的区间
虽然每个 \(f(k)\) 对应的答案区间都不同,但一定能遍历到,所以我可以再遍历一遍k,算出以该区间为答案区间时的 \(f(k)\)
但是这样一来时间复杂度就超了,于是能不能优化?
假如存在某个k,使得答案区间长度等于 \(len\) , 那么这个答案区间一定是所有长度为 \(len\) 的区间里原始区间和最大的那个

code

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int pre[5005]={0},ans[5005]={0};
        int n,x;
        cin>>n>>x;
        int a;
        for(int i=1;i<=n;i++)
        {
            cin>>a;
            pre[i]=pre[i-1]+a;
        }


        for(int len=1;len<=n;len++)
        {
            int sum=pre[len];
            for(int r=len+1;r<=n;r++)
            {
                sum=max(sum,pre[r]-pre[r-len]);
            }

            for(int k=0;k<=n;k++)
            {
                ans[k]=max(ans[k],sum+min(k,len)*x);//构造样例,当只有某一段区间为正值,其他区间为负无穷大时,就算加上k我也不选
            }
        }

        for(int i=0;i<=n;i++) cout<<ans[i]<<" ";
        puts("");
    }
    return 0;
}

posted @ 2024-04-10 21:14  纯粹的  阅读(18)  评论(0)    收藏  举报