Задачка: наибольшая возрастающая непрерывная подпоследовательность (longest increasing contiguous subsequence)
Требуется в заданной последовательности найти наибольшую возрастающую непрерывную подпоследовательность. Например, дана последовательность {1,2,3,-1,2,3,4,5}. В этой последовательности наибольшая возрастающая непрерывная подпоследовательность начинается с позиции 4 и имеет длину 4, т.е. это подпоследовательность {-1,2,3,4,5}.Запишем всю последовательность в массив. Будем последовательно проходить массив. Если элемент массива больше предыдущего, то увеличим счетчик длины последовательности на 1. Если элемент массива меньше или равен предыдущему, то поставим счетчик длины в 1 (т.к. последовательность), и метку начала подпоследовательности поставим равной текущему индексу. При этом проверим, если длина только что окончившейся подпоследовательности больше предыдущей максимальной, то максимальную длину меняем.
Входные данные передаются так: на первой строчке файла стоит кол-во чисел в последовательности. На всех остальных строчках в начале стоит следующее число в последовательности. Пример входного файла:
8 1 2 3 -1 2 3 4 5
Код:
import java.io.*; public class Problem1 { static int[] a; static int startIndex; static int maxLength; static void findMaxIncrSubseq() { if (a.length==1) { startIndex = 0; maxLength = 1; return; } int start = startIndex = 0; int length = maxLength = 1; for (int i=1; i<a.length; i++) { if (a[i] > a[i-1]) { length++; } else { if (length > maxLength) { maxLength = length; startIndex = start; } length = 1; start = i; } } } public static void main(String[] args) throws Exception { FileInputStream fstream = new FileInputStream("in.txt"); DataInputStream in = new DataInputStream(fstream); BufferedReader br = new BufferedReader(new InputStreamReader(in)); String strLine; strLine = br.readLine(); int size = Integer.parseInt(strLine); a = new int[size]; int i=0; while ((strLine = br.readLine()) != null) { a[i] = Integer.parseInt(strLine); i++; } in.close(); findMaxIncrSubseq(); System.out.println("Longest increasing contiguos subsequence starts from " + startIndex + " and is of length " + maxLength); System.out.println("Longest increasing contiguos subsequence:"); for (i=startIndex; i<startIndex+maxLength; i++) { System.out.println(a[i]); } } }
Пример файла in.txt:
12 1 2 3 -10 5 6 7 8 9 0 1 2
Пример вывода:
>java Problem1
Longest increasing contiguos subsequence starts from 3 and is of length 6
Longest increasing contiguos subsequence:
-10
5
6
7
8
9
Немає коментарів:
Дописати коментар