Maison > développement back-end > tutoriel php > Comment écrire l'algorithme de sous-séquence croissante la plus longue en utilisant PHP

Comment écrire l'algorithme de sous-séquence croissante la plus longue en utilisant PHP

PHPz
Libérer: 2023-07-07 10:12:02
original
1200 Les gens l'ont consulté

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;
Copier après la connexion

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']."<br>";
echo "最长递增子序列为:".implode(', ', $result['sequence']);
Copier après la connexion

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal