题意:给你一个数列,你可以先选出一个区间(长度可以是0),将这个区间内的所有数乘以x,然后找出整个数列的最大连续子串和。
题解:采用动态规划的思想,将每一个数字的位置设置三种状态。
dp[i][0],这个状态储存最基础的最大连续子段和,这个值等于
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <set>
using namespace std;
#define LL long long
#define ll LL
#define zero(a) memset(a,0,sizeof(a))
#define rep(i,a,b) for(int (i)=(a); (i)<=(b); ++(i))
#define rd(a) scanf("%d",&(a))
#define rld(a) scanf("%lld",&(a))
const int MAXN = 3e5+10;
const int INF = 0x3f3f3f3f;
LL dp[MAXN][3];
LL a[MAXN];
int main()
{
zero(dp), zero(a);
int n, x;
rd(n), rd(x);
rep(i,1,n) rld(a[i]);
LL ans = 0;
rep(i,1,n){
dp[i][0] = max(dp[i-1][0]+a[i], a[i]);
dp[i][1] = max({dp[i-1][0]+a[i]*x, dp[i-1][1]+a[i]*x, a[i]*x});
dp[i][2] = max({dp[i-1][1]+a[i], dp[i-1][2]+a[i], a[i]});
ans = max({ans, dp[i][0], dp[i][1], dp[i][2]});
}
printf("%lld", ans);
return 0;
}