Voor een slalomwedstrijd wordt de skipiste opgedeeld in een rechthoekig
rooster. Verspreid over dit rooster zijn een aantal poortjes gestoken,
waaraan telkens een score wordt toegekend. De rijen van het rooster worden
van boven naar onder genummerd, en de kolommen van links naar rechts,
telkens vanaf nul. Hierdoor kunnen we een poortje voorstellen als een
reeks
Een skiër vertrekt bovenaan (boven rij 0 van het rooster) en kan de positie (kolom) waar hij vertrekt vrij kiezen. Bij elke stap verplaatst de skiër zich altijd
één rij naar beneden
maximaal één kolom naar links of naar rechts
De bewegingsvrijheden van de skiër kunnen dus als volgt weergegeven worden.
Door zijn beperkte bewegingsvrijheid kan de skiër dus niet altijd
een parcours afleggen dat langs alle poortjes van de skipiste loopt. Door
zijn vrije keuze van de startpositie is elk poortje wel bereikbaar vanaf
de start, maar hij kan niet noodzakelijk van elk poortje naar elk ander
poortje skiën. In de linker figuur hieronder zie je bijvoorbeeld dat
het poortje op positie
De som van de scores van alle poortjes langs het parcours dat een skiër heeft afgelegd, noemen we de totaalscore van het parcours. Voor een gegeven configuratie van een skipiste kunnen we ons dus afvragen wat de maximale totaalscore is die een skiër kan behalen. Voor de skipiste die we hierboven als voorbeeld gebruikt hebben, is de maximale totaalscore gelijk aan 14. In de rechter figuur hierboven zie je het parcours dat de skiër moet afleggen om die totaalscore te behalen.
Het volgende algoritme kan gebruikt worden om de maximale totaalscore te vinden die een skiër op een gegeven skipiste kan behalen:
Sorteer de poortjes van boven naar onder en van links naar rechts:
Bereken in die volgorde de maximale score bij de start en bij elk poortje.
De maximale score bij de start is per definitie gelijk aan nul.
De maximale score bij poortje
De maximale totaalscore is gelijk aan het maximum van de maximale scores bij de start en bij alle poortjes.
Hieronder zie je bijvoorbeeld hoe dit algoritme wordt toegepast op de skipiste die we hierboven als voorbeeld gebruikt hebben.
Gevraagd wordt:
Schrijf een functie isBereikbaar waaraan de posities
van twee poortjes
Schrijf een functie maxScorePoort waarmee de maximale
score bij een poortje kan berekend worden (stap 2 uit het algoritme).
Aan de functie moeten twee argumenten doorgegeven worden: i)
het poortje waarvoor de maximale score moet berekend worden (een reeks
Schrijf een functie maxTotaalscore waaraan een reeks (Array) moet doorgegeven worden met de poortjes op een skipiste. De functie moet de maximale totaalscore teruggeven die een skiër op de gegeven skipiste kan behalen.
> isBereikbaar([0, 0], [1, 0])
True
> isBereikbaar([0, 5], [2, 1])
False
> isBereikbaar([0, 0], [3, 3])
True
> isBereikbaar([0, 0], [3, 4])
False
> maxScorePoort([0, 3, 2], [])
2
> maxScorePoort([1, 0, 6], [[0, 3, 2]])
6
> maxScorePoort([1, 4, 3], [[1, 0, 6], [0, 3, 2]])
5
> maxScorePoort([3, 3, 4], [[1, 4, 5], [0, 3, 2], [1, 0, 6]])
9
> maxScorePoort([4, 1, 2], [[0, 3, 2], [1, 0, 6], [3, 3, 9], [1, 4, 5]])
8
> maxScorePoort([6, 1, 5], [[3, 3, 9], [1, 4, 5], [0, 3, 2], [1, 0, 6], [4, 1, 8]])
14
> maxScorePoort([8, 4, 1], [[6, 1, 14], [4, 1, 8], [1, 0, 6], [1, 4, 5], [3, 3, 9], [0, 3, 2]])
10
> maxTotaalscore([[1, 0, 6], [4, 1, 2], [1, 4, 3], [0, 3, 2], [6, 1, 5], [3, 3, 4], [8, 4, 1]])
14
> maxTotaalscore([[0, 1, 1], [2, 0, 2], [3, 2, 4]])
5