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