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 !