传送门:CF1155D
题目大意:给一个长度为n的序列和一个整数x,你有1次机会可以选择序列的一段子区间,将子区间的所有元素都乘于x,当然你也可以选择不做这个操作,问最大连续子序列和是多少?(1≤n≤3⋅105, −100≤x≤100)
思路:定义dp数组dp[n][3],其中dp[i][0]表示以第i个数结尾的不做乘法最大连续子序列和;dp[i][1]表示以第i个数结尾且至少第i个数乘了x的最大连续子序列和;dp[1][2]表示以第i个数结尾且包含乘了x的元素但第i个数没有乘的最大连续子序列和。
得到状态转移方程如下:
dp[i][0] = max(dp[i - 1][0] + a[i], a[i]);
dp[i][1] = max(max(dp[i - 1][0], dp[i - 1][1]) + a[i] * x, a[i] * x);
dp[i][2] = max(max(dp[i - 1][1], dp[i - 1][2]) + a[i], a[i]);
最终的答案就是dp数组的最大值。