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 }