题解
观察数据范围,看到 \(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;
}
标签:pre,int,Sums,len,Increase,答案,区间,Subarray
From: https://www.cnblogs.com/pure4knowledge/p/18127459