You are given an array aa consisting of nn integers. Beauty of array is the maximum sum of some consecutive subarray of this array (this subarray may be empty). For example, the beauty of the array [10, -5, 10, -4, 1] is 15, and the beauty of the array [-3, -5, -1] is 0.
You may choose at most one consecutive subarray of aa and multiply all values contained in this subarray by xx. You want to maximize the beauty of array after applying at most one such operation.
The first line contains two integers nn and xx (1≤n≤3⋅105,−100≤x≤1001≤n≤3⋅105,−100≤x≤100) — the length of array aa and the integer xx respectively.
The second line contains nn integers a1,a2,…,ana1,a2,…,an (−109≤ai≤109−109≤ai≤109) — the array aa.
Print one integer — the maximum possible beauty of array aa after multiplying all values belonging to some consecutive subarray xx.
5 -2 -3 8 -2 1 -6
22
12 -3 1 3 3 7 1 3 3 7 1 3 3 7
42
5 10 -1 -2 -3 -4 -5
0
In the first test case we need to multiply the subarray [-2, 1, -6], and the array becomes [-3, 8, 4, -2, 12] with beauty 22 ([-3, 8, 4, -2, 12]).
In the second test case we don't need to multiply any subarray at all.
In the third test case no matter which subarray we multiply, the beauty of array will be equal to 0.
把整个序列分成三段来dp。
dp[0]表示没有乘过x序列的最大值。
dp[1]表示正在乘x的序列的最大值。
dp[2]表示已经乘完x的序列的最大值。
则dp[0]=max(dp[0],dp[0]+val);
dp[1]=max(dp[0],dp[1]+x*val);
dp[2]=max(dp[1],dp[2]+val);
比赛的时候真的想不到dp。。还是自己太菜了。
#include <bits/stdc++.h> #define maxn 300005 using namespace std; typedef long long ll; ll dp[3]; int main() { int n; ll m,res=-1e18; scanf("%d%lld",&n,&m); for(int i=1;i<=n;++i) { ll x; scanf("%lld",&x); dp[0]=max(0ll,dp[0]+x); dp[1]=max(dp[0],dp[1]+x*m); dp[2]=max(dp[1],dp[2]+x); res=max(res,dp[2]); } cout<<res<<endl; return 0; }