В этой статье описывается реализация Java самого длинного алгоритма последующей последовательности для массивов. Поделитесь этим для вашей ссылки, следующим образом:
Проблема: Учитывая массив длины n, найдите самую длинную монотонную подпоследовательность автоинсплента (не обязательно непрерывная, но порядок не может быть испорчен). Например: Учитывая массив длины a {1, 3, 5, 2, 4, 6, 7, 8} с длиной 8, тогда его самая длинная монотонная последовательность ампликонов составляет {1, 2, 4, 6, 7, 8}, а его длина - 6.
Идея 1: Когда вы сначала увидите вопрос, многие люди обязательно подумают о LCS в первый раз. Сначала сортируйте массив в новый массив, а затем используйте новый массив и оригинальный массив, чтобы найти LCS, чтобы получить ответ. Многие люди могут представить себе это решение, поэтому я не буду вдаваться в подробности.
Идея 2: Согласно идее идеи 1, вы все равно должны использовать DP, когда вы наконец -то найдете LCS. Почему мы не используем DP, чтобы решить его напрямую? Для массива ARR мы пересекаем массив сзади к фронту и находим самую длительную последующую последовательность, когда последующая последующая заканчивается arr[i] , а затем приобретаем в ней максимальное значение. Вы можете получить самую длинную последующую последовательность всего массива. Итак, как найти самую длинную последующую последовательность, оканчивающуюся на arr[i] ? Это преобразуется в проблему DP. Чтобы требовать самой длинной последующей последовательности arr[i] , вам нужно только найти самую длинную последующую последовательность arr[i-1] . Это: max{arr[i]}=max{arr[i-1]}+1 .
Код реализации Java:
открытый класс arrdemo {public static void main (string [] args) {// int [] arr = {89, 256, 78, 1, 46, 78, 8}; int [] arr = {1, 3, 5, 2, 4, 6, 7, 8}; // int [] arr = {6, 4, 8, 2, 17}; int max = 0; int maxlen = arr.length; // Пройдите массив сзади к вперед и найдите самую длинную длину последующей последовательности при заканчивающемся Arr [i] для (int i = arr.length-1; i> 0; i--) {int [] newarr = new int [i]; System.ArrayCopy (Arr, 0, Newarr, 0, i); int currentlength = 1 + dp (newarr, arr [i]); if (currentlength> max) max = currentlength; // Самая длинная длина самой длинной подпоследовательности - длина исходного массива, // Поскольку нам не нужно находить элемент самой длинной последующей, мы напрямую заканчиваем петлю, чтобы уменьшить время накладных расходов, если (max == maxlen) сломается; } System.out.println (max); } public static int dp (int [] arr, int end) {// рекурсивное конечное условие if (arr.length == 1) {// Если меньше, чем конец, оно включено в последующую длина последующей последовательности +1 if (arr [0] <= end) return 1; иначе вернуть 0; } // Пройти массив и найти позицию элемента, наиболее близкое к концу, и <= end i for (int i = arr.length-1; i> = 0; i--) {if (arr [i] <= end) {// усечь массив от i и сформировать новую массив для Arr [0], чтобы ARR [i-1], чтобы продолжить повторный поиск длины int [] newarr [i]; System.ArrayCopy (Arr, 0, Newarr, 0, i); // Рассчитать самую длинную последующую последовательность при содержании ARR [i] и самой длинной последующей последовательности, когда не содержат ARR [i], соответственно, и принять максимальное значение int содержит = dp (newarr, arr [i]) + 1; int notcontainlen = dp (newarr, end); return содержит natcontainlen? Содержит: notContainLen; }} // Если обнаружен не меньше, то длина возврата равен 0 return 0; }}Результаты работы:
6
Мой метод может занять много места, потому что в середине открываются несколько новых массивов, но я не думаю, что это много - - я не считал его. Если есть что -то не так, поправьте это.
Для получения дополнительной информации об алгоритмах Java, читатели, которые заинтересованы в этом сайте, могут просмотреть темы: «Учебное пособие по структуре данных Java и алгоритм», «Сводка операции Java Dom Node», «Сводка Java File и каталог
Я надеюсь, что эта статья будет полезна для всех Java Programming.