D. Beautiful Array
题意:
一个长为n的数组,一个x,选择数组的一个区间,该区间里的数*x,使得该数组的最大子序和最大
求最大子序和
解析:
用动态规划解决
dp[i][j]为前i个数再j状态下的最大值
dp[i][0]
表示以i为终点还没进入加倍区的最大子段和。dp[i][1]
表示以i为终点在加倍区内的最大子段和。dp[i][2]
表示以i为终点离开加倍区的最大子段和。
ac:
#include <bits/stdc++.h>
#define ll long long
#define MAXN 300005
using namespace std;
ll dp[MAXN][3],ans;
int main()
{
ll n,x,y;
scanf("%lld%lld",&n,&x);
for(int i=1;i<=n;i++)
{
scanf("%lld",&y);
dp[i][0]=max(0LL,dp[i-1][0]+y);
dp[i][1]=max(0LL,max(dp[i-1][0],dp[i-1][1])+y*x);
dp[i][2]=max(0LL,max(dp[i-1][1],dp[i-1][2])+y);
ans=max(ans,dp[i][0]);
ans=max(ans,dp[i][1]);
ans=max(ans,dp[i][2]);
}
printf("%lld\n",ans);
return 0;
}