000
19.06.2007, 21:45 Uhr
MausFan
|
Hallo liebes Forum,
ich habe ein riesen Problem, bei dem ich mit meinen Programmierkenntniessen nicht mehr weiterkomme.
Ich möchte ein Dreieck, weleche aus zufälligen Zahlen basteln. Dies ist mir auch soweit gelungen. Nun kommt der schwierige Teil. Es soll die größt mögliche Summe berechnet werden, die man auf seinem Weg nach unten erreichen kann. Schaut euch zum besseren Verständnis dieses Beispiel an, beidem der rote Faden den Weg darstellt, der die größte Summe ergibt.
www.abload.de/image.php?img=bild23wr.gif
Diese Aufgabenstellung wurde auch noch auf anderen Internetseiten gestellt: http://projecteuler.net/index.php?section=view&id=18
Nun brauche ich einen Algorithmus der genau dies für mich erledigt. Bis jetzt habe ich mir dafür schon einige Tipps geben lassen.
Ich liste das hier auf und hoffe das Ihr was damit anfangen könnt:
Man kann das als Graphenproblem betrachten (der Graph ist sogar azyklisch). Jede Zahl ist ein Knoten, es gibt von jedem Knoten, der kein Blatt ist, zwei Kanten zu seinen beiden Nachfolgern. Es geht jetzt darum, zu jedem Blatt den Pfad zu finden, bei dem die Summe der Zahlen am größten ist. Dazu speichert man in jedem Knoten zwei Dinge: 1) die maximal erreichbare Summe bis dorthin 2) von welchem Vorgängerknoten man dorthin gekommen ist (diese Information entfällt beim Startknoten a)
Jetzt geht man den Baum ebenenweise durch: maximal erreichbare Summe bei a ist a bei b: a+b, bei c: a+c (soweit noch uninteressant) bei d: a+b+d bei e: a+b+e oder a+c+e, je nachdem welches größer ist. Entsprechend wird in e vermerkt, ob der Vorgänger b oder c ist, so dass man später den Pfad zurückverfolgen kann. bei f: a+c+f. usw., die maximal erreichbare Summe bei einem Knoten x ist immer das Maximum der erreichbaren Summen der beiden Vorgänger von x plus x.
Es ist wichtig zu erkennen, dass, egal was weiter unten noch passiert, sich die maximal erreichbare Summe weiter oben nicht mehr ändern kann. Man kann also unbesorgt Ebene für Ebene abarbeiten und hat irgendwann die maximal erreichbare Summe für jedes Blatt, sowie über die Rückwärtskanten den Pfad, der auf diese Summe führt.
Das ist übrigens eine einfache Variante von Dijkstras Algorithmus zur Bestimmung kürzester Pfade in Graphen.
vlt. könntet Ihr auch auch mal das hier anschauen:
www.c-plusplus.de/forum/viewtopic-var-t-is-184034.html
Ich hoffe nun das mir jemand einen Code in c++ schreiben kann, der mir die größt mögliche Summe ausgibt.
Viele Grüsse und vielen Dank MausFan Dieser Post wurde am 19.06.2007 um 21:48 Uhr von MausFan editiert. |