Forum INFOMATH
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
-45%
Le deal à ne pas rater :
WHIRLPOOL OWFC3C26X – Lave-vaisselle pose libre 14 couverts – ...
339 € 622 €
Voir le deal

Problème : du triangle

4 participants

Aller en bas

Problème : du triangle Empty Problème : du triangle

Message par manianis Dim 9 Déc - 15:08

Traduit à partir d'une olympiade internationale d'informatique : IOI94
Code:
    7
  3 8
  8 1 0
 2 7 4 4
4 5 2 6 5

La figure ci-dessus affiche un triangle de nombre. Ecrire un programme qui calcule la somme maximale de nombre en passant par un chemin qui commence du sommet et se termine à un emplacement quelconque de la base.

  • Chaque étape peut se faire en bas en suivant diagonale gauche ou en diagonale droite.
  • Le nombre de lignes dans le triangle est > 1 et <= 100.
  • Les nombres dans le triangle sont compris entre 0 et 99.
Données Entrées
Les données à propos du nombre de lignes dans le triangle sont à lire depuis le fichier INPUT.TXT. Dans notre exemple, le fichier INPUT.TXT est comme suit :
Code:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Données Sorties
La somme maximale est inscrite dans le fichier OUTPUT.TXT. Dans notre exemple : 30

manianis
Nombre Réel
Nombre Réel

Masculin
Nombre de messages : 975
Localisation : Tunisie
Réputation : 4
Points : 6055
Date d'inscription : 11/10/2007

Feuille de personnage
Capacité linguistique:
Problème : du triangle Left_bar_bleue999/1000Problème : du triangle Empty_bar_bleue  (999/1000)

http://manianis.sitesled.com/

Revenir en haut Aller en bas

Problème : du triangle Empty Re: Problème : du triangle

Message par Napoléon Dim 9 Déc - 16:04

Il est très intéressant ce problème.
Le langage recommandé est ... ?
La durée maximale est .... ?
Napoléon
Napoléon
Admin
Admin

Masculin
Nombre de messages : 2934
Localisation : Tunisie
Réputation : 122
Points : 7672
Date d'inscription : 19/03/2007

Feuille de personnage
Capacité linguistique:
Problème : du triangle Left_bar_bleue999/1000Problème : du triangle Empty_bar_bleue  (999/1000)

https://infomath.1fr1.net

Revenir en haut Aller en bas

Problème : du triangle Empty Re: Problème : du triangle

Message par manianis Dim 9 Déc - 19:50

Le langage est le langage de votre choix. Six problèmes de ce type sont à résoudre sur deux journées.

manianis
Nombre Réel
Nombre Réel

Masculin
Nombre de messages : 975
Localisation : Tunisie
Réputation : 4
Points : 6055
Date d'inscription : 11/10/2007

Feuille de personnage
Capacité linguistique:
Problème : du triangle Left_bar_bleue999/1000Problème : du triangle Empty_bar_bleue  (999/1000)

http://manianis.sitesled.com/

Revenir en haut Aller en bas

Problème : du triangle Empty Re: Problème : du triangle

Message par Napoléon Dim 9 Déc - 19:58

Est-ce que tu penses que c'est faisable en deux journée - temps libre?
Et quel est le niveau ciblé?
Napoléon
Napoléon
Admin
Admin

Masculin
Nombre de messages : 2934
Localisation : Tunisie
Réputation : 122
Points : 7672
Date d'inscription : 19/03/2007

Feuille de personnage
Capacité linguistique:
Problème : du triangle Left_bar_bleue999/1000Problème : du triangle Empty_bar_bleue  (999/1000)

https://infomath.1fr1.net

Revenir en haut Aller en bas

Problème : du triangle Empty Re: Problème : du triangle

Message par manianis Dim 9 Déc - 22:29

En effet les IOI (International Olympiads in Informatics) sont des compétitions pour les doués en Informatique.

manianis
Nombre Réel
Nombre Réel

Masculin
Nombre de messages : 975
Localisation : Tunisie
Réputation : 4
Points : 6055
Date d'inscription : 11/10/2007

Feuille de personnage
Capacité linguistique:
Problème : du triangle Left_bar_bleue999/1000Problème : du triangle Empty_bar_bleue  (999/1000)

http://manianis.sitesled.com/

Revenir en haut Aller en bas

Problème : du triangle Empty Re: Problème : du triangle

Message par informix Lun 10 Déc - 23:20

Il y a à mon avis quelques difficultés:

1. la représentation des données dans la mémoire de l'ordinateur, ou ce qu'on appelle Les Structudes des Données.

2. selon cette structure de données, trouver le meilleur algorithme de recherche de la solution.

Il y a plusieurs structures de données possibles:
1. un arbre N-Aire: numéro <=> valuation de l'arc.
2. un graphe: numéro <=> valuation de l'arc.
3. un tableau: numéro <=> contenu d'une case

Il y a plusieurs algorithmes qu'on peut utiliser:
1. chemin le plus cours dans un arbre, graphe.
2. recherche du max dans un tableau (modifié)

c'est ma propre réflexion les amis. J'attends vos comments.
informix
informix
Nombre Rationnel
Nombre Rationnel

Nombre de messages : 399
Réputation : 4
Points : 6326
Date d'inscription : 19/03/2007

Feuille de personnage
Capacité linguistique:
Problème : du triangle Left_bar_bleue1000/1000Problème : du triangle Empty_bar_bleue  (1000/1000)

Revenir en haut Aller en bas

Problème : du triangle Empty Re: Problème : du triangle

Message par manianis Mar 11 Déc - 11:29

Je propose une solution :

Code:
program ioi94_01;

const MAX_COUNT = 100;
type tab = array [1..MAX_COUNT, 1..MAX_COUNT] of integer;

procedure saisie_entree(var n : integer ; var t : tab);
var i, j : integer;
begin
    repeat
        Write('Nombre d''éléments [2..100] : ');
        Readln(n);
    until (n > 1) and (n <= 100);
   
    for j:=1 to n do begin
        for i:=1 to j do begin
            repeat
                Write('0 <= t[', j, ', ', i, '] <= 99 : ');
                Read(t[j, i]);
            until (t[j, i] >= 0) and (t[j, i] <= 99);
        end;
    end;
end;

procedure afficher_tab(n : integer ; var t : tab);
var i, j : integer;
begin
    Writeln;
    for j:=1 to n do begin
        for i:=1 to j do begin
            Write(t[j, i]:3);
        end;
        Writeln;
    end;
end;

function Max(x, y : integer): integer;
begin
    if (x > y) then Max := x else Max := y;
end;

function MaxRS(n, row, col : integer ; var t : tab):integer;
begin
    if (row = n) then MaxRS := t[row, col]
    else MaxRS := t[row, col] + Max(MaxRS(n, row + 1, col, t), MaxRS(n, row + 1, col + 1, t));
end;

var
    n : integer;
    t : tab;
begin
    saisie_entree(n, t);
    afficher_tab(n, t);
    Writeln('Somme Maximale : ', MaxRS(n, 1, 1, t));
    readln;
end.

manianis
Nombre Réel
Nombre Réel

Masculin
Nombre de messages : 975
Localisation : Tunisie
Réputation : 4
Points : 6055
Date d'inscription : 11/10/2007

Feuille de personnage
Capacité linguistique:
Problème : du triangle Left_bar_bleue999/1000Problème : du triangle Empty_bar_bleue  (999/1000)

http://manianis.sitesled.com/

Revenir en haut Aller en bas

Problème : du triangle Empty Re: Problème : du triangle

Message par Napoléon Mar 11 Déc - 13:15

manianis:
Bravo pour la solution. Comme d'habitude Smile

Quelques commentaires:

1. En voyant une matrice qui contient 100*100 = 10.000 entiers, c'est un peu désagréable, au niveau l'espace mémoire requis, surtout que la matrice est triangulaire et qu'au moins sa moitié ne va pas être utilisée. Suppose que MAX_COUNT = 1000n, alors ... ???!!!!

2. La fonction récursive MaxRS est agréable.

3. Ca serait plus difficile si la question était: trouver la somme maximale ainsi que le chemin engendrant cette somme.
Napoléon
Napoléon
Admin
Admin

Masculin
Nombre de messages : 2934
Localisation : Tunisie
Réputation : 122
Points : 7672
Date d'inscription : 19/03/2007

Feuille de personnage
Capacité linguistique:
Problème : du triangle Left_bar_bleue999/1000Problème : du triangle Empty_bar_bleue  (999/1000)

https://infomath.1fr1.net

Revenir en haut Aller en bas

Problème : du triangle Empty Re: Problème : du triangle

Message par manianis Mar 11 Déc - 14:08

Admin a écrit:manianis:
Bravo pour la solution. Comme d'habitude Smile

merci, mais, il faut être franc j'ai jeté un coup d'oeil rapide sur les solutions proposées.
Admin a écrit:1. En voyant une matrice qui contient 100*100 = 10.000 entiers, c'est un peu désagréable, au niveau l'espace mémoire requis, surtout que la matrice est triangulaire et qu'au moins sa moitié ne va pas être utilisée. Suppose que MAX_COUNT = 1000n, alors ... ???!!!!

Le plus simple est d'utiliser une matrice. J'ai pensé à construire un graphe. Mais je me suis planté dès le premier stage. Il serait aimable qu'un membre nous donne une solution à l'aide de graphes.

Admin a écrit:2. La fonction récursive MaxRS est agréable.

La solution récursive est toujours, comme on le dit, est la plus intuitive et la plus simple.

Admin a écrit:3. Ca serait plus difficile si la question était: trouver la somme maximale ainsi que le chemin engendrant cette somme.

Là c'est une autre question car plusieurs chemins peuvent donner la somme maximale (cas d'un triangle formé par la même valeur) et n'oubliez pas qu'il s'agit d'une compétition avec trois exercices à résoudre pendant une journée (8 heures maximum).

Merci pour ces commentaires que je qualifie consructifs.

manianis
Nombre Réel
Nombre Réel

Masculin
Nombre de messages : 975
Localisation : Tunisie
Réputation : 4
Points : 6055
Date d'inscription : 11/10/2007

Feuille de personnage
Capacité linguistique:
Problème : du triangle Left_bar_bleue999/1000Problème : du triangle Empty_bar_bleue  (999/1000)

http://manianis.sitesled.com/

Revenir en haut Aller en bas

Problème : du triangle Empty Re: Problème : du triangle

Message par methodiX Mar 11 Déc - 22:00

je pense que la solution de manianis est très acceptable pour une durée de 3 sujets dans 8 heures (olympiade internationale).

manianis: j'ai une remarque. stp, regardre l'exécution suivante:

Problème : du triangle Ioi9410

c'est faux si j'ai bien compris l'énoncé !

le résultat = 113 !
methodiX
methodiX
Admin
Admin

Masculin
Nombre de messages : 1260
Localisation : Le couloir de l'école polytechnique de Tunis
Réputation : 68
Points : 7054
Date d'inscription : 22/03/2007

Feuille de personnage
Capacité linguistique:
Problème : du triangle Left_bar_bleue1000/1000Problème : du triangle Empty_bar_bleue  (1000/1000)

Revenir en haut Aller en bas

Problème : du triangle Empty Re: Problème : du triangle

Message par manianis Mar 11 Déc - 22:50

Non ce n'est pas faux car :

Code:
    5
    0 0
  0 0 0
  0 0 0 99
99 9 9 0  0

vous aurez remarqué que en dessous du 99 t[4,4] il y'a deux case à zéro.

manianis
Nombre Réel
Nombre Réel

Masculin
Nombre de messages : 975
Localisation : Tunisie
Réputation : 4
Points : 6055
Date d'inscription : 11/10/2007

Feuille de personnage
Capacité linguistique:
Problème : du triangle Left_bar_bleue999/1000Problème : du triangle Empty_bar_bleue  (999/1000)

http://manianis.sitesled.com/

Revenir en haut Aller en bas

Problème : du triangle Empty Re: Problème : du triangle

Message par methodiX Mar 11 Déc - 23:55

Smile désolé donc. faute visuelle!

Autre remarque:
Pourquoi le VAR avant t dans la fonction récursive? le tableau ne va pas être modifié...

elle m'a beaucoup plu la fonction récursive !!! cheers
methodiX
methodiX
Admin
Admin

Masculin
Nombre de messages : 1260
Localisation : Le couloir de l'école polytechnique de Tunis
Réputation : 68
Points : 7054
Date d'inscription : 22/03/2007

Feuille de personnage
Capacité linguistique:
Problème : du triangle Left_bar_bleue1000/1000Problème : du triangle Empty_bar_bleue  (1000/1000)

Revenir en haut Aller en bas

Problème : du triangle Empty Re: Problème : du triangle

Message par manianis Mer 12 Déc - 0:17

Il ne faut pas oublier que la fonction est récursive càd les appels récursifs de cette fonctions sont stockés dans la pile qui risque vite de déborder si on y copie la tableau à chaque fois.
Le Var permet de faire un passage par variable (par référence si vous voulez) ainsi 8 octets seront transmis au programme au lieu des 100*100*2 octets taille du tableau en cas de passage par valeur.

manianis
Nombre Réel
Nombre Réel

Masculin
Nombre de messages : 975
Localisation : Tunisie
Réputation : 4
Points : 6055
Date d'inscription : 11/10/2007

Feuille de personnage
Capacité linguistique:
Problème : du triangle Left_bar_bleue999/1000Problème : du triangle Empty_bar_bleue  (999/1000)

http://manianis.sitesled.com/

Revenir en haut Aller en bas

Problème : du triangle Empty Re: Problème : du triangle

Message par informix Jeu 13 Déc - 20:06

1.
est-ce que ce que vous avez fait (passage par adresse) peut être considéré comme ASTUCE ou bien c'est courant dans les corrections?

2.
y-a-t-il un moyen pour visualiser le contenu de la pile (débogueur?)
informix
informix
Nombre Rationnel
Nombre Rationnel

Nombre de messages : 399
Réputation : 4
Points : 6326
Date d'inscription : 19/03/2007

Feuille de personnage
Capacité linguistique:
Problème : du triangle Left_bar_bleue1000/1000Problème : du triangle Empty_bar_bleue  (1000/1000)

Revenir en haut Aller en bas

Problème : du triangle Empty Re: Problème : du triangle

Message par manianis Ven 14 Déc - 10:31

The difference between Theory and Practice is that in theory there's no difference between theory and practice but in practice there's.

Le passage par référence est recommandé il ne s'agit pas d'une astuce mais d'une optimisation.

La vraie ASTUCE c'est ce que les enseignants d'informatiques disent aux élèves/étudiants : lorsque le contenu d'une variable change dans un module (procédure/fonction) et que ce changement est requis pour le bon déroulement du programme principal il faut alors procéder à un passage par variable. Il omettent de mentionner le cas que je viens d'évoquer pour simplifier au maximum.

Oui il existe un débogueur et je ne sais pas comment l'utiliser : il s'appelle gdb pour les programmes utilisant GCC. Un débogueur doit être capable de visualiser le contenu de la pile. Microsoft Visual Studio offre aussi un bon debugger.

Pour vous étonner plus que çà Java ne connais que le passage par valeur !!! Comment procéder dans ce cas.

manianis
Nombre Réel
Nombre Réel

Masculin
Nombre de messages : 975
Localisation : Tunisie
Réputation : 4
Points : 6055
Date d'inscription : 11/10/2007

Feuille de personnage
Capacité linguistique:
Problème : du triangle Left_bar_bleue999/1000Problème : du triangle Empty_bar_bleue  (999/1000)

http://manianis.sitesled.com/

Revenir en haut Aller en bas

Problème : du triangle Empty Re: Problème : du triangle

Message par manianis Ven 14 Déc - 18:22

J'ai bricolé une solution en utilisant les graphes... C'est trés difficile comme solution !!!
Code:

program ioi94_02;

type
    ptri_cell = ^tri_cell;
    tri_cell = record
        val : integer;
        s : ptri_cell;
        g : ptri_cell;
        d : ptri_cell;
    end;

procedure allocate_cell(var p : ptri_cell);
begin
    New(p);
    Read(p^.val);
    p^.s := nil;
    p^.g := nil; p^.d := nil;
end;

procedure triangle_allocate(var triangle : ptri_cell ; n : integer);
var
    ins_p, p, t, nline : ptri_cell;
    i : integer;
begin
    if triangle = nil then begin
        allocate_cell(p);
        triangle := p;
    end;
   
    ins_p := triangle;
    for i:=2 to n do begin
        t := ins_p;
        nline := ins_p;
       
        while (t <> nil) do begin
            allocate_cell(p);
           
            if (t = ins_p) then begin
                nline := p;
                t^.g := p;
                allocate_cell(p);
            end;
           
            t^.g^.s := p;
            t^.d := p;
            if (t^.s <> nil) then t^.s^.g := p;
           
            t := t^.s;
        end;
       
        ins_p := nline;
    end;
end;

procedure triangle_free(var triangle : ptri_cell);
var
    t, p : ptri_cell;
begin
    if (triangle <> nil) then begin
        triangle_free(triangle^.g);
       
        t := triangle;
        while (t <> nil) do begin
            p := t;
            t := t^.s;
            Dispose(p);
        end;
    end;
end;

procedure afficher_triangle(triangle : ptri_cell);
var
    start, t : ptri_cell;
begin
    start := triangle;
    while (start <> nil) do begin
        t := start;
        while (t <> nil) do begin
            Write(t^.val, ' ');
            t := t^.s;
        end;
        start := start^.g;
        Writeln;
    end;
end;

function Max(x, y : integer): integer;
begin
    if (x > y) then Max := x else Max := y;
end;

function MaxRS(triangle : ptri_cell):integer;
begin
    if (triangle = nil) then MaxRS := 0
    else MaxRS := triangle^.val + Max(MaxRS(triangle^.g), MaxRS(triangle^.d));
end;

var
    triangle : ptri_cell;
    n : integer;
begin
    triangle := nil;
    Readln(n);
    triangle_allocate(triangle, n);
    afficher_triangle(triangle);
    Writeln('Somme Maximale : ', MaxRS(triangle));
    triangle_free(triangle);
    Readln;
end
.

manianis
Nombre Réel
Nombre Réel

Masculin
Nombre de messages : 975
Localisation : Tunisie
Réputation : 4
Points : 6055
Date d'inscription : 11/10/2007

Feuille de personnage
Capacité linguistique:
Problème : du triangle Left_bar_bleue999/1000Problème : du triangle Empty_bar_bleue  (999/1000)

http://manianis.sitesled.com/

Revenir en haut Aller en bas

Problème : du triangle Empty Re: Problème : du triangle

Message par informix Sam 15 Déc - 16:22

maestro manianis jai examiné ta solution longtemps. elle est vraiment parfaite. tu as bien soigné la désallocation de l'espace mémoire: réflexe souvent inexistant chez les programmeurs.

mon défi actuel c'est de faire un programme qui fonctionne meme si la dimension du triangllle est grandeee. je pense que la votre manianis fonctionne, mais, la récursivité gene un peu si la dimension est grande!
informix
informix
Nombre Rationnel
Nombre Rationnel

Nombre de messages : 399
Réputation : 4
Points : 6326
Date d'inscription : 19/03/2007

Feuille de personnage
Capacité linguistique:
Problème : du triangle Left_bar_bleue1000/1000Problème : du triangle Empty_bar_bleue  (1000/1000)

Revenir en haut Aller en bas

Problème : du triangle Empty Re: Problème : du triangle

Message par manianis Sam 15 Déc - 18:42

Il y'a un autre problème mon ami. Avec un triangle de 100 lignes mon programme c'est exécuté pendant 50mn sans trouver un résultat.

Avec n=0 : le programme teste une seule possiblité
Avec n=1 : le programme teste deux possibilités
Avec n=2 : le programme teste quatre possibilités
Avec n=3 : le programme teste huits possibilités
Avec n quelconque le programme teste 2^n possibilité càd pour n=100 il existe 2^100 possibilités
Sachant qu'avec n=30 mon ordinateur a trouvé le résultat en 5mn. avec n=100 le temps sera presque :
5/2^30*2^100=6*10^21 minutes !!!
5.90296E+21

manianis
Nombre Réel
Nombre Réel

Masculin
Nombre de messages : 975
Localisation : Tunisie
Réputation : 4
Points : 6055
Date d'inscription : 11/10/2007

Feuille de personnage
Capacité linguistique:
Problème : du triangle Left_bar_bleue999/1000Problème : du triangle Empty_bar_bleue  (999/1000)

http://manianis.sitesled.com/

Revenir en haut Aller en bas

Problème : du triangle Empty Re: Problème : du triangle

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum