http://codeforces.com/problemset/problem/1155/D
D. Beautiful Array
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 xxrespectively.
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.
题意:给你n个数和一个系数,你可以选择一个区间乘上这个系数,最后算出这些数的最大子段和
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll n,k,x;
ll dp[10],ans;
int main(){
scanf("%lld%lld",&n,&k);
for(int i=1;i<=n;i++)
{
scanf("%lld",&x);
dp[0]=max(1LL*0,dp[0]+x); //最大字段和
dp[1]=max(dp[0],dp[1]+x*k); //前面的最大字段和+当前的数要乘系数
dp[2]=max(dp[1],dp[2]+x); //前面两段的和再加上当前的数不乘系数
ans=max(ans,dp[2]);
}
printf("%lld\n",ans);
return 0;
}