Adloun

algorithmique (école d'ingénieur) · Chapitre 1 · Application directe du cours

Le cambrioleur prudent

Glouton ou dynamique ? · niveau 2

Énoncé

Une rue compte maisons alignées ; la maison contient un butin . Un cambrioleur prudent ne visite jamais deux maisons voisines (l'alarme de l'une réveillerait l'autre). Il veut un butin total maximum.

  • Sur , que donne la stratégie gloutonne « la maison la plus riche encore autorisée d'abord » ?
  • On note le butin maximum sur les premières maisons. Supposons le problème résolu et regardons la maison : donner l'équation de récurrence des valeurs .
  • Écrire calculerM et une fonction récursive qui affiche les maisons visitées. Donner le résultat sur l'exemple.

Corrigé

  • Le glouton prend la maison (butin ), ce qui interdit les maisons et ; puis la maison (), ce qui interdit et . Butin . Or les maisons , , donnent .

nom : x
valeurs : 6 9 6 1 8 7
colorier : 1 4
griser : 0 2 3 5
legende : glouton : maisons 1 et 4, butin 9 + 8 = 17

nom : x
valeurs : 6 9 6 1 8 7
vert : 0 2 4
legende : optimum : maisons 0, 2 et 4, butin 6 + 6 + 8 = 20
  • Supposons le problème résolu sur les premières maisons. Ou bien la maison n'est pas visitée, et le butin est ; ou bien elle l'est, la maison ne l'est pas, et le butin est . Base : , . Hérédité : ,

-


static int[] calculerM(int[] x) { int n = x.length;
    int[] M = new int[n + 1];
    M[0] = 0;                                   // base
    if (n > 0) M[1] = x[0];
    for (int k = 2; k < n + 1; k++)             // hérédité
        M[k] = Math.max(M[k-1], M[k-2] + x[k-1]);
    return M;
}
static void amaisons(int[] M, int[] x, int k) {
    // affiche les maisons visitées parmi les k premières
    if (k <= 0) return;
    if (k == 1) { if (M[1] > 0) System.out.print(" 0"); return; }
    if (M[k] == M[k-1]) amaisons(M, x, k-1);    // la maison k-1 n'est pas visitée
    else { amaisons(M, x, k-2); System.out.print(" " + (k-1)); }
}

x = [6, 9, 6, 1, 8, 7]
glouton (plus grande valeur disponible d'abord) : 17
M = [0, 6, 9, 12, 12, 20, 20]
somme maximum 20 : maisons 0 2 4

nom : M
valeurs : 0 6 9 12 12 20 20
colorier : 6
vert : 1 3 5
fleches : 6->5 5->3:+8 3->1:+6
legende : remontée : M[6] = M[5], puis maisons 4 (+8), 2 (+6) et 0 (+6)

Le calcul et l'affichage sont en .

100 % gratuit

La suite du chapitre est sur Adloun

Exercice suivant et tuteur

Sans compte : le cours, le premier QCM et 2 minutes de podcast et de vidéo. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →