Π. ΚΡΗΤΗΣ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΗΥ 380, «ΑΛΓΟΡΙΘΜΟΙ & ΠΟΛΥΠΛΟΚΟΤΗΤΑ» Φ 07: ΔΥΝΑΜΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η περιγραφή του προβλήματος: Στην άλγεβρα (και με αναρίθμητες εφαρμογές στην αριθμητική ανάλυση) χρησιμοποιούμε πίνακες (ή αλλιώς μητρώα ή μήτρες), για την παράσταση γραμμικών προβλημάτων και μετασχηματισμών. Ένας πίνακας Α έχει δύο διαστάσεις: το πλήθος των γραμμών του γ(α), και το πλήθος των στηλών σ(α), και αποτελείται από γ(α) σ(α) στοιχεία. Όταν δύο πίνακες Α, Β είναι «συνθέσιμοι», δηλαδή οι στήλες του 1 ου ισούνται με τις γραμμές του 2 ου ή σ(α) = γ(β), τότε ορίζεται ο πίνακας γινόμενο Γ = ΑΒ του οποίου οι γραμμές είναι όσες του Α, και οι στήλες όσες του Β, κατά τον τύπο: σ ( Α) γ = α β, i = 1,, γ(α), j = 1,, σ(β) i, j i. k k, j k= 1 Το κόστος C αυτής της πράξης είναι «μεγάλο» και ισούται με C = γ(α) σ(α) σ(β) = γ(α) γ(β) σ(β). Εάν έχουμε μια σειρά πινάκων Αi, i = 1, 2,., N, οι οποίοι ανά δύο διαδοχικοί είναι συνθέσιμοι, (δηλαδή σ(αi) = γ(αi+1) ), τότε ορίζεται το συνολικό γινόμενο: Γ = Α1 Α2... ΑΝ 1 ΑΝ. Το σημαντικό σε αυτό το γινόμενο είναι ότι είναι προσεταιριστικό: το αποτέλεσμα Γ δεν εξαρτάται με ποια σειρά θα εκτελεστούν τα επί μέρους γινόμενα ή πιο απλά «το που θα βάλουμε τις παρενθέσεις». Λ.χ. ισχύει ότι: Γ = (((Α1 Α2) Α3) Α4) Α5 = Α1 ((Α2 Α3) (Α4 Α5 )) Από πρακτικής πλευράς είναι όμως εξίσου σημαντικό, ότι αν και το αποτέλεσμα Γ είναι το ίδιο, το πλήθος των πράξεων που θα χρειαστούν για τον υπολογισμό του δεν είναι το ίδιο. Π.χ. αν έχουμε τους πίνακες Χ (5 10), Υ (10 8), Ζ (8 20), το γινόμενο ((Χ Υ) Ζ) επιφέρει (5 10 8) + (5 8 20) = 1200 πράξεις, ενώ το γινόμενο (Χ (Υ Ζ)) επιφέρει (5 10 20) + (10 8 20) = 2600 πράξεις, (πλήθος υπερδιπλάσιο). Ποιός είναι ο οικονομικότερος τρόπος να πολλαπλασιάσουμε Ν πίνακες; Προσέξτε ότι η τοποθέτηση των παρενθέσεων, λ.χ. κατά την έκφραση (((Α1 Α2) Α3) Α4) Α5 ή την έκφραση Α1 ((Α2 Α3) (Α4 Α5 )), αντιστοιχεί σε ένα δυαδικό δένδρο με 5 φύλλα, (και εν γένει με Ν φύλλα): A 2 A 3 A 4 A 5 A 2 A 3 A 4 A 5 Τα δυαδικά δένδρα με Ν φύλλα είναι πάρα πολλά για να τα εξετάσουμε όλα εξαντλητικά είναι ασυμπτωτικά (πολύ) περισσότερα από 3 Ν, και ακριβέστερα είναι: 1 1 2( N 1) B N = N ( N 1) Με τόσο μεγάλο κόστος κινδυνεύουμε το κόστος εύρεσης της οικονομικότερης λύσης να καταλήξει μεγαλύτερο από την οικονομία που εξασφαλίζει... Υπάρχει λοιπόν ένας οικονομικός τρόπος να βρούμε τον καλύτερο τρόπο να πολλαπλασιάσουμε Ν πίνακες; Η απάντηση είναι «ΝΑΙ» και αποτελεί ένα καλό, πλήρες, (και παλαιό), παράδειγμα εφαρμογής της τεχνικής του δυναμικού προγραμματισμού. Η τεχνική αυτή έχει 7 σημαντικά βήματα. Τα απαριθμούμε και τα εφαρμόζουμε μετά επεξηγήσεων στο παράδειγμα του πολλαπλασιασμού πινάκων. 1 Γι αυτό το θέμα μπορείτε να δείτε το άρθρο Catalan number στoν γνωστό ιστότοπο της Wikipedia. Πανεπιστήμιο Κρήτης Τμ. Επιστήμης υπολογιστών «Αλγόριθμοι & πολυπλοκότητα, ΗΥ380 Γεώργιος Φ.Δ. Γεωργακόπουλος, 1/5/2014, 1/5
1. οι αποφάσεις που καθορίζουν αναγωγικά την λύση. 2. τα υποπροβλήματα που προκύπτουν είναι του ιδίου ακριβώς τύπου με το αρχικό; 3. η αναδρομική κοστολόγηση με βάση όλες τις ενδεχόμενες «αποφάσεις». 4. η παραμετροποίηση των υποπροβλημάτων. 5. η πινακοποίηση του κόστους και η «κάτωθεν σάρωση». 6. η κράτηση σημειώσεων για τις λαμβανόμενες βέλτιστες αποφάσεις. 7. η αξιοποίηση των σημειώσεων για την κατασκευή της βέλτιστης λύσης. Βήμα 1 ο : Κατ αρχάς διευκρινίζουμε τις αποφάσεις που καθορίζουν το αποτέλεσμα. Εδώ έχοντας να πολλαπλασιάσουμε Ν πίνακες, (να κάνουμε δηλαδή Ν 1 πολλαπλασιασμούς) το καθοριστικό είναι ποιόν πολλαπλασιασμό θα αφήσουμε τελευταίο. Έστω ότι αυτός θα είναι ο υπ. αρ. k αυτός δηλαδή μεταξύ του Ak και του Ak+1: Γ = (Α1 Α2 Αk) (Αk+1 ΑN 1 ΑN ) Αν μπορούσαμε να διαλέγαμε το «σωστό» k κάθε φορά, τότε ο πολλαπλασιασμός θα έπαιρνε την μορφή που δίδει το εξής απόσπασμα κώδικα: Συνάρτηση Γινόμενο(...Α N : ακολουθία πινάκων ): πίνακας { N=1: Γινόμενο Ν=2: Γινόμενο Α Ν Ν 3: { k το «σωστό» ανάμεσα στα 1 έως Ν-1 // ποιό k; Γινόμενο Γινόμενο(...Α k ) Γινόμενο( Α k+1...α N ) } Οι αποφάσεις που επιλύουν το πρόβλημα, το ανάγουν σε μικρότερου μεγέθους προβλήματα (αλλιώς δεν θα το επέλυαν...). Εδώ η επιλογή του k, μας οδηγεί στους πολλαπλασιασμούς,...α k και Α k+1...α N όπου και οι δύο αναφέρονται σε μικρότερο πλήθος πινάκων (το πολύ Ν 1, αντί για Ν). Βήμα 2 ο : Είναι τα υποπροβλήματα του ιδίου τύπου; Το ερώτημα εδώ είναι όμως το εξής: τα υποπροβλήματα που προκύπτουν είναι ακριβώς του ιδίου τύπου με το αρχικό; Και εδώ αυτό συμβαίνει πράγματι: το κόστος του υπ.αρ. k γινομένου είναι γ(ak) σ(ak) γ(ak+1), και αυτό δεν επηρρεάζεται από, ούτε επηρρεάζει το με ποιό τρόπο θα εκτελέσουμε τα επί μέρους γινόμενα...α k και Α k+1...α N επομένως πρέπει και αρκεί να εκτελέσουμε αυτά επίσης κατά τον βέλτιστο τρόπο. Αυτό το φαινόμενο είναι συχνό στα προβλήματα βελτιστοποίησης: τα υποπροβλήματα ενός προβλήματος βελτιστοποίησης είναι εύλογο (αν και όχι αναγκαίο) να πρέπει να λυθούν και αυτά κατά βέλτιστο τρόπο. Έχουμε λοιπόν για το πρόβλημά μας μια αναγωγή σε προβλήματα ακριβώς του ιδίου τύπου. Βήμα 3 ο : Αναδρομική κοστολόγηση με βάση όλες τις ενδεχόμενες αποφάσεις. Οι αποφάσεις που επιλύουν το πρόβλημα, καθορίζουν το κόστος το οποίο κόστος θέλουμε εδώ να ελαχιστοποιήσουμε και επομένως κάπως να το υπολογίσουμε. Ο τρόπος υπολογισμού μας δίνει και το κόστος αρκεί να συντάξουμε έναν αναδρομικό τύπο που να εκφράζει ότι από όλες τις επιτρεπτές επιλογές θα (πρέπει να) διαλέξουμε την οικονομικότερη. Ο σχετικός κώδικας είναι σχεδόν προφανής: Συνάρτηση Κόστος(...Α N : ακολουθία πινάκων ): πλήθος-πράξεων { N=1: Κόστος 0 Ν=2: Κόστος γ( )σ( )γ(α Ν ) Ν 3: Κόστος min { γ( )σ(α k )γ(α Ν ) + Κόστος(...Α k ) 1 k<n + Κόστος( Α k+1...α N ) } Αλλά και αυτή η μορφή υπολογισμού δεν είναι οικονομική: το δένδρο των αναδρομικών κλήσεων είναι μεγάλο εξ άλλου η παραπάνω αναζήτηση δεν αποτελεί παρά μια «κομψή» αναδιατύπωση της Πανεπιστήμιο Κρήτης Τμ. Επιστήμης υπολογιστών «Αλγόριθμοι & πολυπλοκότητα, ΗΥ380 Γεώργιος Φ.Δ. Γεωργακόπουλος, 1/5/2014, 2/5
εξαντλητικής εξέτασης όλων των δυνατών δένδρων εκτέλεσης του πολλαπλασιασμού Α1 Α2... ΑΝ! Βήμα 4 ο : Παραμετροποίηση των υποπροβλημάτων. Η παραπάνω διατύπωση είναι ελαφρά παραπλανητική αν φανούμε απρόσεκτοι. Η διαδικασία κοστολόγησης Κόστος(...Α N ) του πολλαπλασιασμού της σειράς των πινάκων...α N ανατρέχει στα υποπροβλήματα...α k και Α k+1...α N, μέσω των αναδρομικών κλήσεων Κόστος(...Α k ) και Κόστος( Α k+1...α N ). Όταν όμως ενεργοποιηθεί λ.χ. η πρώτη εξ αυτών, το ρόλο του «Ν» θα παίξει η τιμή k, και θα προκληθούν (με το οποιοδήποτε νέο k, 1 k < k), δύο νέες κλήσεις Κόστος(...Α k ) και Κόστος( Α k +1...Α k ), κοκ. Αυτή η «περιπλοκή» φτάνει όμως μέχρις εκεί. Η μορφή των υποπροβλημάτων που καλούμαστε να λύσουμε δεν είναι παρά η εξής (εκφρασμένη παραμετρικά): Κόστος( Α i...α j ), = «βρες το κόστος υπολογισμού του γινομένου Ai Aj, για 1 i j Ν». Και η αναδρομική σχέση μας ζητά... «βρες το καλύτερο k, i k < j, για να υπολογιστεί το Ai Aj ως (Ai Ak) ( Ak+1 Aj)». Όλα αυτά τα υποπροβλήματα όμως δεν είναι πολλά είναι «μόνον» το πολύ Ο(Ν 2 ) πλήθος πολυωνυμικό ως προς Ν και όχι εκθετικό! Στην περίπτωσή μας μπορούμε να σχεδιάσουμε αυτά τα (υπο)προβλήματα σαν μια πυραμίδα η βάση της οποίας είναι Ν περιπτώσεις i = j, και η κορυφή το ένα συνολικό πρόβλημα i = 1, j = Ν. Σε κάθε πλαίσιο γράφονται οι παράμετροι ενός υποπροβλήματος, και σε αυτές αντιστοιχεί ένα υπό εύρεση βέλτιστο κόστος εκτέλεσης του σχετικού πολλαπλασιασμού....α 5......Α 3......Α 3...Α 5 Α 5 X Α 3 Α 5 Α 6 Στο παραπάνω σχήμα έχουμε σχεδιάσει την διάσπαση του γινομένου A2 A6 στο σημείο k = 3, δηλαδή στα υποπροβλήματα A2 A3 και A4 A6, όπου φαίνεται ότι τα κόστη στα διάφορα επίπεδα αυτής της πυραμίδας εξαρτώνται από τα κόστη σε χαμηλότερα επίπεδα. Βήμα 5 ο : Η πινακοποίηση του κόστους και η «κάτωθεν σάρωση». Δεν είναι λοιπόν αναγκαίο να υπολογίσουμε τα κόστη αναδρομικά, αλλά αρκεί να συμπληρώσουμε αυτή την πυραμίδα με μία κάτωθεν σάρωση αρχίζοντας δηλαδή από το χαμηλότερο επίπεδο και σαρώνοντας αυτήν προς το υψηλότερο. Εικονίζουμε αυτή την διαδικασία στο παραπάνω σχήμα. δ = 0, 1,..., N 1...A N Α i...α j Κόστος[i,j] (A i...a k )(A k+1...a j ) i = 1, 2,..., N δ ( j = i + δ )...A 2 A k A k+1 k = i, i+1,..., j 1 Για την σάρωση αρκούν τρείς «μετρητές» : ο δ με τιμές 0 έως Ν 1, για τα Ν επίπεδα, ο i με τιμες 1 έως Ν δ, για το εκάστοτε υποπρόβλημα (i, j) όπου j = i + δ, και, ο k με τιμές i έως j 1, για τη διάσπαση στα προβλήματα (i, k) (k+1, j), βλ. κόκκινες γραμμές. Πανεπιστήμιο Κρήτης Τμ. Επιστήμης υπολογιστών «Αλγόριθμοι & πολυπλοκότητα, ΗΥ380 Γεώργιος Φ.Δ. Γεωργακόπουλος, 1/5/2014, 3/5
Το σημαντικό τώρα και το κύριο χαρακτηριστικό του δυναμικού προγραμματισμού είναι ότι αντί να χρησιμοποιούμε μια εκ των άνω αναδρομική διαδικασία Κόστος( Α i...α j ) χρησιμοποιούμε έναν πίνακα Κόστος[i,j], όπου αποθηκεύουμε το εκάστοτε βέλτιστο κόστος του πολλαπλασιασμού Α i...α j, τον οποίο πίνακα συμπληρώνουμε με μια εκ των κάτω σάρωση όπως εξηγήσαμε στην προηγούμενη παράγραφο. Αυτή η διαδικασία είναι «οικονομική» (σε σχέση με μια εκθετικής πλοκής): αρκούν Θ(Ν 3 ) πράξεις! Διαδικασία Κοστολόγηση(...Α N : ακολουθία πινάκων ) { Για δ = 0 έως Ν-1 Περίπτωση { δ=0: Για i = 1 έως Ν { Κόστος[i,i] 0 } δ=1: Για i = 1 έως Ν-1 { Κόστος[i,i+1] γ(α i )σ(α i )γ(α i+1 ) } δ 2: Για i = 1 έως Ν-δ { j (i+δ) } C + Για k = i έως j-1 { C min{c, γ(α i )σ(α k )γ(α j ) + Κόστος[i,k] + Κόστος[k+1,j] Κόστος[i,j] C Βήμα 6 ο : Η κράτηση σημειώσεων για τις λαμβανόμενες αποφάσεις. Τέλος καλό όλα καλά, αλλά δεν έχουμε φθάσει ακόμα στο τέλος διότι ενώ έχουμε πλέον έναν αλγόριθμο που υπολογίζει το βέλτιστο κόστος του πολλαπλασιασμού A1 AΝ, δεν μας απαντά με ποιό τρόπο επιτυγχάνεται αυτό το βέλτιστο κόστος. Αυτό συνέβη διότι την στιγμή που διαλέξαμε το min{ } κόστος, αδιαφορήσαμε για το ποιά επιλογή, (ποιό «k»), οδηγεί σε αυτό το κόστος. Προφανώς αρκεί να κρατήσουμε εκεί μια σχετική σημείωση. Επειδή αυτή η σημείωση αφορά στο υποπρόβλημα που ορίζεται από το ζεύγος των παραμέτρων (i, j), αρκεί άλλος ένας πίνακας Επιλογή[i, j] για την σημείωση του σχετικού k. Διαδικασία Κοστολόγηση(...Α N : ακολουθία πινάκων ) { Για δ = 0 έως Ν-1 Περίπτωση { δ=0: Για i = 1 έως Ν { Κόστος[i,i] 0 } δ=1: Για i = 1 έως Ν-1 { Κόστος[i,i+1] γ(α i )σ(α i )γ(α i+1 ) } δ 2: Για i = 1 έως Ν-δ { j (i+δ) Κόστος[i,j] + Για k = i έως j-1 { C γ(α i )σ(α k )γ(α j ) + Κόστος[i,k] + Κόστος[k+1,j] Εάν C < Κόστος[i,j] τότε { Κόστος[i,j] C Επιλογή[i,j] k // σημείωση min } Βήμα 7 ο : Η αξιοποίηση των σημειώσεων. Το τελικό βήμα μας φέρνει εκεί που έπρεπε, δηλαδή εκεί όπου ξεκινήσαμε (βλ. βήμα 1 ο ): ο πίνακας Επιλογή[i, j] περιέχει το «σωστό» k, και ο αρχικός κώδικας γνωρίζει πλέον ποιές (σωστές) αποφάσεις να πάρει. Ο τελικός κώδικας ακολουθεί: Κοστολόγηση(...Α Ν ) Γ Γινόμενο(...Α Ν ) // υπολογισμός βέλτιστου με παράλληλη // κράτηση σημειώσεων Επιλογή[i,j], και // όπου: Συνάρτηση Γινόμενο( Α i...α j : ακολουθία πινάκων ): πίνακας { j=i : Γινόμενο Α i j=i+1: Γινόμενο Α i Α j j i+2: { k Επιλογή[i,j] // το «σωστό» k! Γινόμενο Γινόμενο( Α i...α k ) Γινόμενο( Α k+1...α j ) } Πανεπιστήμιο Κρήτης Τμ. Επιστήμης υπολογιστών «Αλγόριθμοι & πολυπλοκότητα, ΗΥ380 Γεώργιος Φ.Δ. Γεωργακόπουλος, 1/5/2014, 4/5
Προς ΕΞΑΣΚΗΣΗ Βασιζόμενοι στα προηγούμενα παραδείγματα (σημειώσεων & φροντιστηρίου) θα πρέπει να είστε σε θέση να λύσετε τα παρακάτω προβλήματα. Δώσατε γραπτώς το 4 ο και άλλα 2 από αυτά, με τις απαραίτητες εξηγήσεις. Εφαρμόστε τα «7» βήματα του δυναμικού προγραμματισμού, και οπωσδήποτε τα 3 ο, 4 ο και 5 ο. 1. Δίδονται δύο συμβολοσειρές Α και Β με μήκη Μ και Ν, και ζητείται η μεγίστου μήκους συμβολοσειρά που εμφανίζεται ως υπακολουθία και στις δύο σειρές (όχι κατ ανάγκην στις ίδιες, ούτε κατ ανάγκην σε συνεχόμενες, θέσεις π.χ. η σειρά «ααββα» εμφανίζεται ως «κοινή υπακολουθία» στις συμβολοσειρές Α = «βαγαβγβα» και Β = «ααγβγγβαγαβ»). 2. Σε μια γραμμή σιδηροδρομικού δικτύου υπάρχουν Ν σταθμοί. Η διεύθυνση του δικτύου έχει ορίσει Μ ζώνες ταξιδίων. Κάθε ζώνη ζμ, μ = 1, 2,..., Μ, αρχίζει από τον σταθμό αμ, τελειώνει στον σταθμό βμ, και έχει εισιτήριο με ενιαία τιμή τμ για μια διαδρομή από οποιοδήποτε σταθμό της ζώνης ζμ προς οποιοδήποτε άλλο σταθμό της ίδιας ζώνης. Θέλουμε να προσδιορίσουμε τον φθηνότερο τρόπο να ταξιδεύσει κάποιος επιβάτης από τον σταθμό i στον σταθμό j, για 1 i < j N. 3. Δίδεται μια ακολουθία Ν φυσικών αριθμών α = α1, α2,..., αν και θέλουμε να ανιχνεύσουμε την μακρύτερη υπακολουθία της α η οποία είναι γνησίως αύξουσα. 4. Δίδονται Ν εμπορεύματα, έκαστο με αξία ακ και βάρος βκ, καθώς και δύο φορτηγά με όριο φόρτωσης βάρους Β1 για το 1 ο, και Β2 για το 2 ο. Ποιά είναι η μεγαλύτερη αξία εμπορευμάτων που είναι δυνατόν να μεταφέρουμε με τα δύο φορτηγά συνολικά (χωρίς, φυσικά, να υπερβούμε τα επί μέρους όρια φόρτωσης); 5. Δίδονται δύο κείμενα / συμβολοσειρές Α και Β. Επί της σειράς Α επιτρέπονται οι εξής ενέργειες: ΕΝΘΕΣΗ(κ, σ) ενθέτει, ως πρόσθετο σύμβολο της Α, το σ ανάμεσα στις θέσεις κ και κ+1. ΔΙΑΓΡΑΦΗ(κ) διαγράφει το υπ.αρ. κ σύμβολο της Α. ΑΛΛΑΓΗ(κ, σ) αλλάζει το υπ.αρ. κ σύμβολο της Α από οτιδήποτε είναι ήδη, σε σ. Κάθε τέτοια ενέργεια κοστολογείται με μοναδιαίο κόστος. Ποιό είναι το ελάχιστο κόστος μετασχηματισμού της σ/σειράς Α στην σ/σειρά Β; 6. Δύο παίκτες διαλέγουν εναλλάξ με την σειρά τους είτε το πρώτο είτε το τελευταίο από μια σειρά με Ν κέρματα, έκαστο των οποίων έχει αξία ακ, και το παίρνουν για λογαριασμό τους. Πόση είναι η μέγιστη αξία μπορεί να εξασφαλίσει ο 1 ος παίκτης, (όσο καλά και εάν παίξει ο αντίπαλός του για το δικό του όφελος); Υποδείξεις: 1. Η κοινή υπακολουθία των Α[1..Μ] και Β[1..Ν], προκαλεί μια αντιστοίχιση ανάμεσα σε σύμβολα των Α και Β. Εξετάστε εάν το τελευταίο ζεύγος συμβόλων Α[Μ] και Β[Ν] συμμετέχει ή όχι σε μια τέτοια αντιστοίχιση, και συνεχίστε ένα τέτοιο έλεγχο «αναδρομικά». 2. Εξετάστε το κόστος μιας διαδρομής i j με την υπόθεση ότι είναι διαθέσιμες μόνον οι ζώνες ζ1, ζ2,..., ζκ 1, και στη συνέχεια επιτρέψατε ως διαθέσιμη και την εκάστοτε επόμενη ζώνη ζκ, για κ = 1, 2,..., Μ. Ελέγξατε εάν πρέπει να εξεταστούν όλοι οι σταθμοί της ζκ ή αν αρκούν οι σταθμοί ακ και βκ. 3. Ορίσατε ως Μ(κ) το μήκος της όποιας μακρύτερης (γνησίως αύξουσας) υπακολουθίας τέτοιας ώστε να τελειώνει με το στοιχείο ακ, για κ = 1, 2,..., Ν. Διερευνήσατε πώς αυτή εξαρτάται από τις «προηγούμενες» τιμές Μ[1],..., Μ[κ 1]. Η ζητουμένη τιμή εξαρτάται προφανώς από τα Μ[1]...Μ[Ν]. 4. Εφαρμόστε, με μια ελαφρά διαφοροποίηση, την τεχνική του «άπληστου σάκκου» (βλ. σημειώσεις). 5. Εξετάστε με ποιό τρόπο το βέλτιστο κόστος Κ[i, j] μετασχηματισμού ενός αρχικού τμήματος Α[1..i] σε ένα αρχικό τμήμα B[1..j] εξαρτάται (μέσω ΔΙΑΓΡΑΦΩΝ, ΕΝΘΕΣΕΩΝ, ή ΑΛΛΑΓΩΝ) από τα K[i 1, j], K[i, j 1] και K[i 1, j 1], για 1 i M, 1 j N. 6. Έστω Α(i, j) η μέγιστη αξία που μπορεί να πετύχει ο 1 ος παίκτης όταν στο τραπέζι έχουν μείνει τα κέρματα από το υπ.αρ. i έως και το υπ. αρ. j, 1 i j N, και είναι η σειρά του να παίξει. Εξετάστε τις δύο επιλογές που έχει και προσέξτε ότι το κέρδος του εξαρτάται από αυτόν μεν, αλλά και από ό,τι χειρότερο μπορεί να του συμβεί αναλόγως με την αμέσως επόμενη κίνηση του αντιπάλου του. Πανεπιστήμιο Κρήτης Τμ. Επιστήμης υπολογιστών «Αλγόριθμοι & πολυπλοκότητα, ΗΥ380 Γεώργιος Φ.Δ. Γεωργακόπουλος, 1/5/2014, 5/5