Comment écrire l'algorithme de sous-séquence croissante la plus longue en utilisant PHP
Introduction :
La sous-séquence croissante la plus longue est un problème informatique classique, qui consiste à trouver la sous-séquence croissante la plus longue dans une séquence. En informatique, il existe de nombreuses solutions à ce problème, dont la programmation dynamique. Cet article explique comment écrire l'algorithme de sous-séquence croissante la plus longue à l'aide de PHP et fournit des exemples de code.
Étape 1 : Comprendre le problème de la sous-séquence croissante la plus longue
Avant de commencer à écrire l'algorithme, vous devez d'abord comprendre la définition de la sous-séquence croissante la plus longue. Étant donné une suite A, on veut trouver la sous-suite B la plus longue telle que B soit strictement croissante. Par exemple, pour la séquence A = [2, 4, 3, 5, 1, 7, 6, 9, 8], sa sous-séquence croissante la plus longue est B = [2, 3, 5, 7, 9], avec une longueur de 5.
Étape 2 : Utiliser la programmation dynamique pour résoudre le problème
La programmation dynamique est une méthode efficace pour résoudre le problème de sous-séquence croissante la plus longue. Nous pouvons enregistrer la longueur de la sous-séquence croissante la plus longue se terminant par A[i] via un tableau dp[i]. Ensuite, nous obtenons la longueur de la sous-séquence croissante la plus longue en parcourant le tableau A et en mettant à jour le tableau dp.
Exemple de code :
Voici un exemple de code pour l'algorithme de sous-séquence croissante la plus longue écrit en PHP :
function longestIncreasingSubsequence($arr) { $n = count($arr); $dp = array_fill(0, $n, 1); // 初始化 dp 数组,每个元素的初始值都为 1 for ($i = 1; $i < $n; $i++) { for ($j = 0; $j < $i; $j++) { if ($arr[$i] > $arr[$j]) { $dp[$i] = max($dp[$i], $dp[$j] + 1); } } } $maxLength = max($dp); // 最长递增子序列的长度 return $maxLength; } $arr = [2, 4, 3, 5, 1, 7, 6, 9, 8]; $length = longestIncreasingSubsequence($arr); echo "最长递增子序列的长度为:".$length;
L'exécution du code ci-dessus affichera la longueur de la sous-séquence croissante la plus longue de 5, conformément à notre exemple précédent.
Étape 3 : Algorithme d'optimisation
Grâce à l'algorithme de programmation dynamique ci-dessus, nous pouvons obtenir la longueur de la sous-séquence croissante la plus longue, mais nous ne pouvons pas obtenir la sous-séquence spécifique. Si l’on souhaite également obtenir les éléments spécifiques de la sous-séquence croissante la plus longue, on peut légèrement optimiser l’algorithme.
Exemple de code :
Ce qui suit est un exemple de code optimisé pour l'algorithme de sous-séquence croissante la plus longue :
function longestIncreasingSubsequence($arr) { $n = count($arr); $dp = array_fill(0, $n, 1); // 初始化 dp 数组,每个元素的初始值都为 1 for ($i = 1; $i < $n; $i++) { for ($j = 0; $j < $i; $j++) { if ($arr[$i] > $arr[$j]) { if ($dp[$j] + 1 > $dp[$i]) { $dp[$i] = $dp[$j] + 1; $prev[$i] = $j; // 记录递增子序列的上一个元素的下标 } } } } $maxLength = max($dp); // 最长递增子序列的长度 // 构建最长递增子序列 $index = array_search($maxLength, $dp); $lis = []; while ($index !== null) { $lis[] = $arr[$index]; $index = $prev[$index] ?? null; } $lis = array_reverse($lis); // 反转子序列,得到递增顺序 return [ 'length' => $maxLength, 'sequence' => $lis ]; } $arr = [2, 4, 3, 5, 1, 7, 6, 9, 8]; $result = longestIncreasingSubsequence($arr); echo "最长递增子序列的长度为:".$result['length']."
"; echo "最长递增子序列为:".implode(', ', $result['sequence']);
L'exécution du code ci-dessus affichera la longueur de la sous-séquence croissante la plus longue comme 5 et imprimera la sous-séquence croissante la plus longue comme [2 , 3, 5, 7, 9].
Résumé :
Cet article explique comment écrire l'algorithme de sous-séquence croissante la plus longue à l'aide de PHP et fournit des exemples de code. Grâce à l'idée de programmation dynamique, nous pouvons résoudre efficacement le problème de la sous-séquence croissante la plus longue. J'espère que cet article sera utile aux lecteurs qui souhaitent apprendre et utiliser l'algorithme de sous-séquence croissante la plus longue.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!
Comment afficher deux divs côte à côte
Quelles sont les méthodes de création d'un site Web mobile ?
Caractères tronqués commençant par ^quxjg$c
Comment implémenter la fonction de chat en ligne de Vue
La différence entre Fahrenheit et Celsius
diffusion sur iPad
Méthode de requête de nom de domaine de deuxième niveau
Où dois-je indiquer mon lieu de naissance : province, ville ou comté ?