publicclassMain{ publicstaticvoidmain(String[] args){ Scanner sc = new Scanner(System.in); int N = sc.nextInt(); int M = sc.nextInt(); long[] array = newlong[N]; for (int i = 0; i < N; i++) { array[i] = sc.nextInt(); } sc.close();
// 特殊情况判断,如果数组中每个数字都是负数,那么选择这些负数中最大的那个 long minus = 0; long bigest = array[0]; for (int i = 0; i < N; i++) { if (array[i] < 0) { minus++; } bigest = Math.max(bigest, array[i]); } if (minus == N) { System.out.println(bigest); return; }
long oneSum = maxSubSequence(array);
if (M == 1) { System.out.println(oneSum); return; }
// 计算出两个的最大 long[] array2 = newlong[2 * N]; for (int i = 0; i < N; i++) { array2[i] = array[i]; array2[i + N] = array[i]; } long twoMax = maxSubSequence(array2);
// 计算出三个的最大 long[] array3 = newlong[3 * N]; for (int i = 0; i < N; i++) { array3[i] = array[i]; array3[i + N] = array[i]; array3[i + N + N] = array[i]; } long threeMax = maxSubSequence(array3);
if (M == 2) { System.out.println(twoMax); return; } if (M == 3) { System.out.println(threeMax); return; } if (M > 3) { long sub = threeMax - twoMax; if (sub > 0) { System.out.println(twoMax + (M - 2) * sub); } else { long max = Math.max(oneSum, twoMax); max = Math.max(max, threeMax); System.out.println(max); } } }
publicstaticlongmaxSubSequence(long[] array){
long length = array.length; long res = 0; long temp = 0; for (long i = 0; i < length; i++) { temp += array[(int) i]; if (temp > res) { res = temp; } elseif (temp < 0) { temp = 0; } } return res; } }