Increase Subarray Sums

原题链接

题解

观察数据范围,看到 n<=5000 便确定了 O(n2) 左右的算法,这样一来我可以遍历所有的区间
虽然每个 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 @   纯粹的  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示