CF1155D - Beautiful Array

题意:给你一个序列和x,你可以选择任意一个子串(可以为空)乘上x,使得得到的序列最大子串和最大。求这个最大值。30w,2s。

解:设fi,0/1/2表示序列前i个数还没乘x/正在乘x/乘完了x的最大后缀和。答案就是这个DP数组的最大值。

 1 #include <bits/stdc++.h>
 2 
 3 typedef long long LL;
 4 const int N = 300010;
 5 
 6 LL a[N], x, f[N][3];
 7 int n;
 8 
 9 int main() {
10     scanf("%d%lld", &n, &x);
11     for(int i = 1; i <= n; i++) {
12         scanf("%lld", &a[i]);
13     }
14     LL ans = 0;
15     for(int i = 1; i <= n; i++) {
16         f[i][0] = std::max(a[i], f[i - 1][0] + a[i]);
17         f[i][1] = std::max(std::max(a[i] * x, f[i - 1][1] + a[i] * x), f[i - 1][0] + a[i] * x);
18         f[i][2] = std::max(a[i], std::max(f[i - 1][2] + a[i], f[i - 1][1] + a[i]));
19         ans = std::max(std::max(ans, f[i][0]), std::max(f[i][1], f[i][2]));
20     }
21     printf("%lld\n", ans);
22     return 0;
23 }
AC代码

相关文章: