Este artigo descreve a implementação do Java do algoritmo subsequente mais longo para matrizes. Compartilhe -o para sua referência, como segue:
Problema: Dada uma variedade de comprimento n, encontre a sub-sequência de autoinncrement mais longa monotônica (não necessariamente contínua, mas a ordem não pode ser confusa). Por exemplo: dada uma matriz de comprimento A {1, 3, 5, 2, 4, 6, 7, 8} com comprimento 8, então sua sequência de amplicon monotônica mais longa é {1, 2, 4, 6, 7, 8} e seu comprimento é 6.
IDEA 1: Quando você vê a pergunta a princípio, muitas pessoas definitivamente pensarão no LCS pela primeira vez. Primeiro, classifique a matriz em uma nova matriz e use a nova matriz e a matriz original para encontrar LCs para obter a resposta. Muitas pessoas podem imaginar essa solução, então não vou entrar em detalhes.
IDEA 2: De acordo com a idéia da Idea 1, você ainda precisa usar o DP quando finalmente encontrar LCS. Por que não usamos o DP para resolvê -lo diretamente? Para o Array ARR, atravessamos a matriz por trás para a frente e encontramos a subsequência mais longa quando a subsequência termina com arr[i] e, em seguida, pegamos o valor máximo nele. Você pode obter a subsequência mais longa de toda a matriz. Então, como encontrar a subsequência mais longa que termina com arr[i] ? Isso é convertido em um problema de DP. Para exigir a subsequência mais longa do arr[i] , você só precisa encontrar a subsequência mais longa do arr[i-1] . Isto é: max{arr[i]}=max{arr[i-1]}+1 .
Código de implementação de Java:
public class 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; // atravessa a matriz por trás para a frente e encontre o comprimento subseqüente mais longo ao terminar com arr [i] para (int i = ar.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; // O comprimento mais longo da subsequência mais longa é o comprimento da matriz original, // porque não precisamos encontrar o elemento da subsequência mais longa, terminamos diretamente o loop para reduzir a sobrecarga de tempo se (max == maxlen) quebrar; } System.out.println (max); } public static int dp (int [] arr, int end) {// Condição final recursiva if (arr.Length == 1) {// Se menor que o final, ele está incluído na subsequência, o comprimento da subsequência +1 se (arr [0] <= end) retornar 1; caso contrário, retorne 0; } // Atravesse a matriz e encontre a posição do elemento mais próxima do final e <= final i para (int i = ar.Length-1; i> = 0; i-) {if (prisão [i] <= end) {// trunce a matriz de i e formar uma nova matriz para Arr [0 para Arr [i-1] para continuar recursivamente; System.arraycopy (arr, 0, newarr, 0, i); // Calcule a subsequência mais longa ao conter arr [i] e a subsequência mais longa quando não estiver contendo arr [i], respectivamente, e assumir o valor máximo int containslen = dp (newarr, arr [i]) + 1; int notcontainlen = dp (newarr, fim); Retorno containslen> notcontainlen? Containslen: notcontainlen; }} // Se não houver menor que a extremidade for encontrada, o comprimento do retorno é 0 retornar 0; }}Resultados em execução:
6
Meu método pode ocupar muito espaço porque várias novas matrizes são abertas no meio, mas acho que não é muito - - eu não contei. Se houver algo errado, corrija -o.
Para obter mais informações sobre os algoritmos Java, os leitores interessados neste site podem visualizar os tópicos: "Estrutura de dados Java e tutorial de algoritmo", "Resumo das dicas de nó da operação Java Dom", "Resumo de dicas de operação de Java e Operação de Java" e "Resumo de Java cache" Tips "TIPS"
Espero que este artigo seja útil para a programação Java de todos.