time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
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.
Input
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 .
Output
Print one integer — the maximum possible beauty of array aa after multiplying all values belonging to some consecutive subarray xx .
Examples
Input
Copy
5 -2 -3 8 -2 1 -6
Output
Copy
22
Input
Copy
12 -3 1 3 3 7 1 3 3 7 1 3 3 7
Output
Copy
42
Input
Copy
5 10 -1 -2 -3 -4 -5
Output
Copy
0
Note
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,写下以后再看看。
题意:给出一个n,一个k,n表示将有几个数,在这段长度为n的序列中可以任意选择。
一段连续的序列乘以这个k,求最后整段序列的和最大为多少。
#include<bits/stdc++.h>
using namespace std;
const int N = 3e5 + 10;
typedef long long ll;
ll a[N], f[N][3]; // 0:还没有乘 1:正在乘 2:已经乘过断开
int main(){
int n, k;
cin >> n >> k;
for (int i = 1; i <= n; i++)
cin >> a[i];
ll ans = 0;
for (int i = 1; i <= n; i++)
{
f[i][0] = max(f[i - 1][0] + a[i], a[i]); //没乘可以由没乘的得到;
f[i][1] = max({f[i - 1][0] + a[i] * k, f[i - 1][1] + a[i] * k, a[i] * k}); //正在乘可以由还没乘或者正在乘的得到;
f[i][2] = max({ f[i - 1][2] + a[i], f[i - 1][1] + a[i], a[i] }); //已经断开的 可以由断开的或者正在乘的得到;
ans = max({ f[i][0], f[i][1], f[i][2], ans }); //取最大
}
cout << ans << endl;
return 0;
}