[Rythme Sanskrit] Solution récursive incompatible ?

16 déc. 2016 à 20:35:04 Modifié le 16 déc. 2016 à 20:36:32 (Temps d’exécution horrible ! :p)

Bonjour à tous !

Voici ma solution au problème Rythme Sanskrit, niveau 2.

Lien du problème :

https://prologin.org/train/2008/semifinal/rythme_sanskrit

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    //Longueur du vers
    int longueur = 0;
    scanf("%d", &longueur);

    //Compteur de combinaisons
    int compteur = 0;

    //Appel de la fonction récursive en commençant par un vers vide (taille 0)
    compterCombinaisons(0, longueur, &compteur);

    printf("%d", compteur);

    return 0;
}

/*
Cette fonction récursive peut être représentée par la construction d'un arbre, dont chaque nœud représente un vers en construction.
On ajoute une branche dont le vers sera celui du parent + longueur 1
Et une branche dont le vers sera celui du parent + longueur 2.
Si la fonction reçoit un vers dont la longueur correspond à la longueur voulue, le compteur est incrémenté.
Sinon si la fonction reçois un vers de longueur < à la longueur voulue, alors on appelle une nouvelle construction de vers comme ci-dessus...
Naturellement, si la fonction reçoit une longueur de vers > à la longueur voulue, on arrête la récursivité.
*/
void compterCombinaisons(int longueurActuelle, int longueur, int *compteur)
{
    if(longueurActuelle == longueur)
        (*compteur)++;

    else if(longueurActuelle > longueur)
        return;

    compterCombinaisons(longueurActuelle+1, longueur, compteur);
    compterCombinaisons(longueurActuelle+2, longueur, compteur);
}

Après réflexion au brouillon, j'arrivais bien à trouver tous les vers constructibles différents en construisant un arbre, dont chaque nœud possède deux enfants, l'un étant égal au vers parent + C, l'autre au vers parent + L. Si un nœud correspond à la longueur voulue, on s'arrête là pour ce nœud, une nouvelle combinaison à été trouvée.

Vous vous en doutez, mon algorithme se présente donc sous la forme d'une fonction récursive. Seulement, je l'ai vite remarqué, pour une longueur avoisinant la valeur maximale de longueur, mon code tourne aux alentours des 10s... Je commence à croire que la récursivité n'est pas la bonne solution et que je dois m'en référer à l'itératif. Seulement je trouve le problème dur à modéliser autrement ! Quelques indices seraient la bienvenue. Pas trop clairs svp, faîtes moi réfléchir !! :)

Merci d'avance, et bonne chance à tous les autres participants !

Bonsoir !

Tu ne te concentres pas sur le bon aspect du problème:

Tu n'as pas besoin de modéliser le problème dans son ensemble, seulement l'évolution du compte de permutations.

Le sujet te donne un indice de taille:

1
2
3
On remarque par exemple que, si on ajoute C devant les poèmes de taille 9
et L devant les poèmes de taille 8, on retrouve alors l'ensemble des poèmes
de longueur 10.

Bon courage !

Répondre au sujet

Vous devez vous enregistrer ou vous connecter pour poster des messages.