题目链接:https://codeforces.com/contest/1155/problem/D
题意是给了n个数,可以选择一个子区间,使得这个区间内的每一个数乘x,然后求一个和最大的子区间的值。
思路就是dp,对于一个区间有三种情况:
1. 选择这个数 2. 选择这个数乘x 3. 选择这个数,但是之前出现过了乘x的区间
然后更新这个过程中的最大值就好了。
AC代码:
代码语言:javascript复制#include <bits/stdc .h>
#define ll long long
#define maxn 300005
using namespace std;
int n;
ll x, xx;
ll dp[maxn][3];
int main()
{
scanf("%d%lld",&n,&x);
ll ans = 0;
for(int i=1;i<=n;i ) {
scanf("%lld", &xx);
dp[i][0] = max(0LL, dp[i-1][0] xx);
dp[i][1] = max(dp[i-1][0], dp[i-1][1]) xx * x;
dp[i][2] = max(dp[i-1][1], dp[i-1][2]) xx;
ans = max(dp[i][0], ans);
ans = max(dp[i][1], ans);
ans = max(dp[i][2], ans);
}
printf("%lldn", ans);
return 0;
}