Складні задачі

Задачка: наибольшая возрастающая непрерывная подпоследовательность (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

Немає коментарів:

Дописати коментар