第一行输入一个正整数
,代表询问次数。
对于每次询问,输入两行:
第一行输入两个正整数
和
。代表数组的大小,以及小红可以修改成的元素。
第二行输入
个正整数
,代表小红拿到的数组。



每组所有询问的
的和不超过200000。
输出
行,每行输出一个整数,代表连续子数组的最大和。
3 5 10 5 -1 -5 -3 2 2 -3 -5 -2 6 10 4 -2 -11 -1 4 -1
15 -2 15
第一组询问,修改第二个数。
第二组询问,不进行任何修改。
第三组询问,修改第三个数。
import java.util.Scanner; // dp[i][0/1]:0表示未修改 1表示修改1次 // 状态机DP:先学好买股票 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int t = in.nextInt(); StringBuilder sb = new StringBuilder(); while (t-- > 0) { int n = in.nextInt(), x = in.nextInt(); long[][] dp = new long[n + 1][2]; long max = Long.MIN_VALUE; for (int i = 1; i <= n; i++) { int a = in.nextInt(); // 未修改:普通的连续子数组最大和 dp[i][0] = Math.max(dp[i - 1][0], 0) + a; // 修改1次:沿用上个数修改1次的 &nbs***bsp;使用上个数未修改的+当前数修改为x dp[i][1] = Math.max(dp[i - 1][1] + a, Math.max(dp[i - 1][0], 0) + x); max = Math.max(max, Math.max(dp[i][0], dp[i][1])); } sb.append(max).append('\n'); } System.out.print(sb.toString()); } }