Description |
输入一个长度为n 的整数序列(A1,A2,……An),从中找出一段连续的长度不超过m的子序列,使得这个子序列的和最大。 |
Input |
有多组测试数据。 对于每组测试数据的第一行,包含二个整数n和m,表示本组有n个测试数据,子序列长度为m,下一行为n个测试数据。 |
Output |
对于每组测试数据,输出最大的子序列和,并换行。 |
Sample Input |
3 1 1 2 3 3 2 -1000 1000 1 10 2 3 8 9 7 4 8 9 2 3 7 |
Sample Output |
3 1001 17 |
import java.util.Scanner; public class 数列 { public static void main(String[] args) { Scanner input = new Scanner(System.in); while (input.hasNext()) { int n = input.nextInt(); int m = input.nextInt(); int[] arr = new int[n]; // 读取序列中的元素 for (int i = 0; i < n; i++) { arr[i] = input.nextInt(); } // 计算并输出最大子序列和 System.out.println(maxSum(n, m, arr)); } input.close(); } public static int maxSum(int n, int m, int[] arr) { int maxSum = Integer.MIN_VALUE; for (int length = 1; length <= m; length++) { //截取所需子序列长度 int currentSum = 0; for (int i = 0; i < length; i++) { //子序列求和 currentSum += arr[i]; } maxSum = Math.max(maxSum, currentSum); //每次循环,将最大值付给maxSum for (int i = length; i < n; i++) { //核心方法,窗口移动法;前面已经截取了子序列的长度,既定义了窗口,现在只需要将窗口按位移动至末尾即可,移动方法是获取一个新的数,放弃旧的数 即currentSum = currentSum + arr[i];向下移动获取新的数;currentSum = currentSum - arr[i-length]放弃旧的数,实现移动 currentSum += arr[i] - arr[i - length]; maxSum = Math.max(maxSum, currentSum); } } return maxSum; } }
标签:arr,Scanner,int,测试数据,序列,input,数据 From: https://blog.csdn.net/2301_80273979/article/details/139189231