Educational Codeforces Round 63 (Rated for Div. 2) D. Beautiful Array (dp)

数组子数组乘x求最大序列和问题
博客围绕数组问题展开,给定含n个整数的数组a和整数x,可选择至多一个连续子数组乘以x,目标是最大化数组的最大连续子数组和(即数组的美)。还给出输入输出格式及示例,最后提到这是一道动态规划题。

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;
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值