发布时间:2023-10-05 09:30
子段连续
求最大子段和(dp)
int Maxsum(int n,int *x)
{
int sum = 0,b = 0,ll,rr;
for(int i = 1;i <= n;i++)
{
if(b > 0)
{b += x[i];}
else
{b = x[i];}
if(b > sum)
{sum = b;}
}
return sum;
}
C、Increase Subarray Sums
求各个长度时的最大子段和,x需要加的个数分别加到对应长度的子段和上使得sum最大。
#include
using namespace std;
typedef long long ll;
ll b[5005],dp[5005];
int main(){
ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--){
ll n,x;
cin>>n>>x;
for(int i=1;i<=n;i++) cin>>b[i],b[i]=b[i]+b[i-1],dp[i]=-1e18;//前缀和
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
dp[j-i+1]=max(dp[j-i+1],b[j]-b[i-1]);//各个长度的最大子段和
for(int i=0;i<=n;i++){
ll mx=0;
for(int j=0;j<=n;j++)
mx=max(mx,dp[j]+min(i,j)*x);//x的个数分别加到对应长度的最大子段上
cout<<mx<<\' \';
}
cout<<\'\\n\';
}
return 0;
}