Increase Subarray Sums

纯粹的發表於2024-04-10

原題連結

題解

觀察資料範圍,看到 \(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;
}