Class Hub
Dynamic programming·Διάλεξη 14·~44 min

L14 · Δυναμικός Προγραμματισμός I — Memoization & Σταθμισμένος Χρονοπρογραμματισμός

Τι θα δούμε

Ξεκινά το τελευταίο μεγάλο κεφάλαιο: ο δυναμικός προγραμματισμός (dynamic programming, DP). Είναι το πιο εξεταζόμενο κομμάτι της ύλης — και αυτό που οι φοιτητές βρίσκουν πιο «μαγικό». Στόχος αυτής της διάλεξης: να πάψει να είναι μαγικό.

Θα δούμε την ιδέα μέσα από το απλούστερο παράδειγμα (Fibonacci), μετά το πρώτο «πραγματικό» πρόβλημα (σταθμισμένος χρονοπρογραμματισμός διαστημάτων), και θα κωδικοποιήσουμε μια συνταγή 4 βημάτων που εφαρμόζεται σε κάθε DP πρόβλημα.

Τα τρία αλγοριθμικά μοντέλα

Το παράδειγμα-εκκίνηση: Fibonacci

Η ακολουθία Fibonacci ορίζεται αναδρομικά:

Η απευθείας μεταφορά σε κώδικα είναι κομψή — και καταστροφική:

fib(n):
αν n ≤ 1: επίστρεψε n
επίστρεψε fib(n−1) + fib(n−2)
Σωστό, αλλά η πολυπλοκότητα είναι ≈ O(2ⁿ) — εκθετική.

Γιατί είναι τόσο αργό; Επικάλυψη υποπροβλημάτων

Ο κώδικας είναι σωστός — γιατί όμως είναι τόσο αργός; Αντί να το συμπεράνουμε, ας παρακολουθήσουμε τι κάνει στ' αλήθεια η fib. Κάθε κλήση fib(k) γεννά δύο νέες, τις fib(k−1) και fib(k−2)· αυτές γεννούν άλλες δύο η καθεμιά, και ούτω καθεξής. Όλες μαζί σχηματίζουν ένα δέντρο αναδρομής — κι εκεί κρύβεται το πρόβλημα.

Το δέντρο αναδρομής του Fibonacci

Σύρε το n και δες το δέντρο κλήσεων. Πάτησε έναν κόμβο για να φωτιστεί κάθε άλλη κλήση του ίδιου fib(k).

fib(5)n = 5
F5F4F3F2F1F0F1F2F1F0F3F2F1F0F1
νέος υπολογισμόςεπιλεγμένο fib(k)
Αφελής αναδρομή
15
κλήσεις της fib()
Με memoization
9
κλήσεις της fib()

Για fib(5) το memoization κάνει 1.7× λιγότερες κλήσεις.

Πέρα από το δέντρο — πόσες κλήσεις χρειάζονται
fib(n)ΑφελήςMemoization
fib(10)17719
fib(20)21.89139
fib(30)2.692.53759

Αφελής: εκθετική, ≈ 2ⁿ. Memoization: γραμμική, 2n−1. Στο fib(30) η διαφορά είναι ήδη εκατομμύρια προς δεκάδες.

Κάθε κύκλος είναι μία κλήση της fib(). Το δέντρο σχεδόν διπλασιάζεται σε κάθε επίπεδο, γιατί το ίδιο fib(k) ξαναϋπολογίζεται απ’ την αρχή ξανά και ξανά. Πάτησε έναν κόμβο για να το δεις — ή γύρνα στο «Memoized».

Σύρε το n (κράτησέ το για τώρα στο «Αφελής») και πρόσεξε δύο πράγματα:

  • Το δέντρο σχεδόν διπλασιάζεται σε κάθε επιπλέον επίπεδο. Ο μετρητής κλήσεων δεν ανεβαίνει γραμμικά — εκτοξεύεται, περίπου σαν . Ο πίνακας στο τέλος δείχνει πού φτάνει αυτό: το fib(30) θέλει πάνω από δύο εκατομμύρια κλήσεις.
  • Πάτησε σε έναν κόμβο — π.χ. σε ένα fib(2). Φωτίζονται όλες οι άλλες κλήσεις του ίδιου fib(2) στο δέντρο. Είναι πολλές· και η καθεμιά ξαναϋπολογίζει από την αρχή ακριβώς την ίδια τιμή.

Αυτό το δεύτερο είναι η ρίζα του κακού, και έχει όνομα: επικάλυψη υποπροβλημάτων (overlapping subproblems). Το ίδιο υποπρόβλημα — «πόσο κάνει το fib(2);» — ξαναεμφανίζεται αμέτρητες φορές μέσα στην αναδρομή. Ο αφελής αλγόριθμος δεν είναι αργός επειδή έχει δύσκολη δουλειά· είναι αργός επειδή κάνει την ίδια εύκολη δουλειά ξανά και ξανά.

Η λύση: memoization

Αφού το πρόβλημα είναι ότι υπολογίζουμε το ίδιο πράγμα πολλές φορές, η λύση γράφεται σχεδόν μόνη της: υπολόγισέ το μία φορά, και κράτησέ το.

Γύρνα τώρα στο interactive παραπάνω και πάτα το κουμπί «Memoized». Ίδιο n, ίδιο πρόβλημα — αλλά το δέντρο καταρρέει: κάθε fib(k) υπολογίζεται μία μόνο φορά, και κάθε επόμενη φορά που ζητείται επιστρέφεται έτοιμο από τον πίνακα (ο πράσινος κόμβος «cache hit», χωρίς υποδέντρο από κάτω). Ο μετρητής κλήσεων πέφτει από εκθετικός σε γραμμικό.

Στην πράξη το ίδιο αποτέλεσμα το πετυχαίνουμε ακόμα πιο καθαρά — χωρίς καθόλου αναδρομή. Γεμίζουμε έναν πίνακα από κάτω προς τα πάνω (bottom-up): πρώτα τις βασικές περιπτώσεις, και μετά κάθε επόμενο όρο από τους δύο προηγούμενους.

fib2(n):
αν n ≤ 1: επίστρεψε n
A[0] ← 0 ; A[1] ← 1
για i = 2 έως n:
A[i] ← A[i−1] + A[i−2]
επίστρεψε A[n]
Κάθε F(k) υπολογίζεται ακριβώς μία φορά → O(n) αντί για O(2ⁿ).

Κάθε υπολογίζεται ακριβώς μία φορά. Η πολυπλοκότητα πέφτει από εκθετική σε γραμμική — αλλάζοντας μόνο πού αποθηκεύεις τα ενδιάμεσα αποτελέσματα.

Σταθμισμένος χρονοπρογραμματισμός διαστημάτων

Τώρα το πρώτο πραγματικό πρόβλημα. Είναι το πρόβλημα του L11με μία προσθήκη.

Είσοδος: αιτήματα. Το αίτημα ξεκινά τη στιγμή , τελειώνει τη στιγμή , και έχει βαρύτητα . Δύο αιτήματα είναι συμβατά αν δεν επικαλύπτονται.

Στόχος: υποσύνολο ανά δύο συμβατών αιτημάτων με μέγιστο άθροισμα βαρυτήτων .

Γιατί δεν αρκεί ο άπληστος

Στο L11, όταν όλες οι βαρύτητες ήταν ίσες με , το άπληστο κριτήριο «μικρότερος χρόνος λήξης» έδινε αποδεδειγμένα βέλτιστη λύση. Το ένστικτο λέει πως κάποιο άπληστο κριτήριο θα δουλεύει και τώρα που οι εργασίες έχουν βαρύτητες. Δοκίμασε τα δύο πιο φυσικά — και δες τα να αποτυγχάνουν:

Γιατί ο άπληστος αποτυγχάνει με βάρη

Ο άπληστος εξετάζει τα διαστήματα κατά αύξοντα χρόνο λήξης. Κάθε ράβδος δείχνει την αξία της — δες ποια διαλέγει.

1.1 · αξία 12.3 · αξία 13.4 · αξία 14.2 · αξία 1000123456789101112
Άπληστος
0
Βέλτιστο
·
Κανόνας «μικρότερος χρόνος λήξης» — ο νικητής του L11, όταν όλα τα βάρη ήταν 1. Εδώ τα βάρη διαφέρουν. Πάτα «Επόμενο».
Βήμα 0 / 5

Στο πρώτο στιγμιότυπο, μια φθηνή εργασία που τυχαίνει να τελειώνει πρώτη μπλοκάρει μια εργασία που αξίζει . Στο δεύτερο, μια ακριβή εργασία μπλοκάρει δύο φθηνότερες που μαζί την ξεπερνούν. Το πρόβλημα είναι βαθύ: η σωστή απόφαση για μια εργασία εξαρτάται από όλες τις υπόλοιπες, ενώ ο άπληστος κοιτάζει μόνο μία τη φορά.

Η προετοιμασία: ταξινόμηση και

Πριν στήσουμε την αναδρομή, χρειαζόμαστε δύο προετοιμασίες.

Πρώτη: ταξινόμηση. Διατάσσουμε τα αιτήματα κατά χρόνο λήξης, ώστε . Από εδώ και πέρα, «αίτημα » σημαίνει «το -οστό αίτημα που τελειώνει».

Δεύτερη: η ποσότητα . Φαντάσου ότι αποφασίζεις να βάλεις το αίτημα στη λύση σου. Αμέσως αποκλείεις κάθε προηγούμενο αίτημα που επικαλύπτεται μαζί του. Το ερώτημα είναι: ποιο είναι το τελευταίο προηγούμενο αίτημα που σου μένει ακόμα διαθέσιμο; Αυτό ακριβώς ονομάζουμε .

Ένα χρήσιμο γεγονός: επειδή τα αιτήματα είναι ταξινομημένα κατά λήξη, τα συμβατά με το είναι πάντα ένα αρχικό κομμάτι — κι όλα τα ενδιάμεσα το επικαλύπτουν. Διάλεξε ένα αίτημα παρακάτω και δες ποιο είναι το του και ποια αιτήματα αποκλείει:

Τι είναι το p(j) — διάλεξε ένα αίτημα
p(8) = 5

Πάτησε σε ένα αίτημα. Κίτρινο = το j · μπλε = το p(j) · κόκκινο = ασύμβατα που αποκλείονται.

s = 121 · v=22 · v=43 · v=44 · v=75 · v=26 · v=17 · v=58 · v=30246810121416
p(8) = 5το αίτημα 5 λήγει στο 12 ≤ 12 = s(8)
Διάλεξες το αίτημα 8. Ξεκινά τη στιγμή s = 12. Τα αιτήματα 1, 2, 3, 4, 5 τελειώνουν ώς τότε — είναι συμβατά μαζί του, και το τελευταίο τους είναι το p(8) = 5. Τα αιτήματα 6, 7 τελειώνουν μετά το 12 → ασύμβατα: αν πάρεις το 8, αυτά αποκλείονται.
Όλα τα p(j):

Η αναδρομή — μια δυαδική επιλογή

Ορίζουμε = η τιμή της βέλτιστης λύσης για τα αιτήματα . Κοιτάμε το αίτημα και ρωτάμε: μέσα ή έξω;

  • Το είναι ΜΕΣΑ. Τότε αποκλείονται όλα τα ασύμβατα με το — τα . Ό,τι μένει είναι η βέλτιστη λύση για τα . Συνεισφορά: .
  • Το είναι ΕΞΩ. Τότε η βέλτιστη λύση είναι ακριβώς η βέλτιστη για τα . Συνεισφορά: .

Δεν ξέρουμε ποια περίπτωση ισχύει — οπότε παίρνουμε τη μεγαλύτερη:

Δες την αναδρομή να γεμίζει τον πίνακα. Σε κάθε βήμα φαίνονται οι δύο υποψήφιες τιμές — «το μέσα» και «το έξω» — και ποια κερδίζει:

Σταθμισμένος χρονοπρογραμματισμός — γέμισμα του πίνακα M
Αρχή

Κίτρινο = το αίτημα j · μπλε = ο συμβατός προκάτοχος p(j) · πράσινο = στη λύση.

1 · v=22 · v=43 · v=44 · v=75 · v=26 · v=17 · v=58 · v=30246810121416
Πίνακας M
0
M[0]
·
M[1]
·
M[2]
·
M[3]
·
M[4]
·
M[5]
·
M[6]
·
M[7]
·
M[8]
Τα 8 αιτήματα του παραδείγματος, ταξινομημένα κατά χρόνο λήξης. M[0] = 0. Γεμίζουμε αριστερά → δεξιά.
Βήμα 0 / 9

Ο αλγόριθμος

Η απευθείας αναδρομή είναι εκθετική — ακριβώς όπως ο αφελής Fibonacci, το πλήθος κλήσεων μεγαλώνει σαν . Η θεραπεία είναι η ίδια: απομνημόνευση.

ΑλγόριθμοςΣταθμισμένος χρονοπρογραμματισμός (DP)
O(n log n)
Ταξινόμησε κατά λήξη, υπολόγισε τα p(j), και γέμισε τον πίνακα M με την αναδρομή «το j μέσα ή έξω».
Είσοδος:
n αιτήματα με χρόνους έναρξης/λήξης και βαρύτητες
Έξοδος:
η μέγιστη συνολική βαρύτητα ενός συνόλου συμβατών αιτημάτων

Με λόγια. Ταξινόμησε τα αιτήματα κατά χρόνο λήξης και υπολόγισε όλα τα . Μετά γέμισε έναν πίνακα με αύξουσα σειρά: το είναι το μεγαλύτερο ανάμεσα στο «πάρε το » () και στο «παράτα το » (). Το είναι η απάντηση.

Ισοδύναμα, top-down με memoization — η αναδρομή λύνει κάθε υποπρόβλημα, αλλά το αποθηκεύει:

Υπολογισμός των σε

Είπαμε πως όλα τα βγαίνουν σε . Δεν είναι προφανές: ο απλός τρόπος — για κάθε , ψάξε προς τα πίσω για το τελευταίο συμβατό αίτημα — κάνει δουλειά. Πώς πέφτουμε στο ;

Το κόλπο: έχουμε δύο ταξινομημένες ακολουθίες — τους χρόνους λήξης και τους χρόνους έναρξης — και τις συγχωνεύουμε, ακριβώς όπως το merge της συγχωνευτικής ταξινόμησης (L03). Δύο δείκτες, ο πάνω στις λήξεις και ο πάνω στις ενάρξεις, σαρώνουν τις ακολουθίες από μία φορά:

  • Αν η τρέχουσα λήξη είναι από την τρέχουσα έναρξη , τότε το αίτημα προλαβαίνει να τελειώσει — είναι έγκυρος προκάτοχος. Προχωράμε τον .
  • Αλλιώς, η λήξη έρχεται πολύ αργά. Άρα ο τελευταίος που πρόλαβε ήταν ο : θέτουμε και προχωράμε τον .

Κάθε βήμα προχωρά έναν από τους δύο δείκτες κατά ένα, και κανένας δεν ξεπερνά το — άρα το πολύ βήματα συνολικά. Δες τη σάρωση να τρέχει βήμα-βήμα — στο interactive κάθε έναρξη δείχνει σε ποιο αίτημα ανήκει, ώστε το να καταγράφεται στο σωστό:

Υπολογισμός όλων των p(j) σε O(n)
Βήμα 0 / 13

Συγχώνευση δύο ταξινομημένων πινάκων με δύο δείκτες — όπως το merge της συγχωνευτικής ταξινόμησης.

Χρόνοι λήξης fᵢ — ταξινομημένοι
5αίτ. 1
▲ i
7αίτ. 2
8αίτ. 3
10αίτ. 4
12αίτ. 5
13αίτ. 6
14αίτ. 7
16αίτ. 8
Χρόνοι έναρξης sⱼ — ταξινομημένοι
1αίτ. 1
▲ j
2αίτ. 2
3αίτ. 4
4αίτ. 3
6αίτ. 5
8αίτ. 7
9αίτ. 6
12αίτ. 8
i = 1, j = 1 — έτοιμοι για την πρώτη σύγκριση
Αποτέλεσμα — p(j)
·
p(1)
·
p(2)
·
p(3)
·
p(4)
·
p(5)
·
p(6)
·
p(7)
·
p(8)
Δύο ταξινομημένοι πίνακες — οι χρόνοι λήξης και οι χρόνοι έναρξης — και δύο δείκτες i, j που ξεκινούν στο 1. Σε κάθε βήμα συγκρίνουμε τη λήξη fᵢ με την έναρξη sⱼ. Πάτα «Επόμενο».

Εύρεση της λύσης

Ο αλγόριθμος υπολογίζει τη μέγιστη τιμή. Για να βρούμε ποια αιτήματα την πετυχαίνουν, κάνουμε ένα πέρασμα προς τα πίσω — σε κάθε ρωτάμε «ποια από τις δύο περιπτώσεις κέρδισε;»

Η συνταγή του δυναμικού προγραμματισμού

Κάθε πρόβλημα DP — όσα θα δούμε στα L15L17 — λύνεται με τα ίδια 4 βήματα:

Κάρτα μνήμηςΣταθμισμένος χρονοπρογραμματισμός (DP)
Λέξεις-κλειδιά
επικαλυπτόμενα υποπροβλήματαταξινόμηση κατά λήξηp(j) = τελευταίο συμβατόOPT(j) = max{μέσα, έξω}memoizationp(j) σε O(n) με δύο δείκτες
Τα βήματα στο μυαλό σου
1Ταξινόμησε τα αιτήματα κατά χρόνο λήξης· υπολόγισε p(j) για καθένα.
2Όρισε OPT(j) = βέλτιστη τιμή για τα πρώτα j αιτήματα.
3Αναδρομή: OPT(j) = max{ vⱼ + OPT(p(j)), OPT(j−1) } — το j μέσα ή έξω.
4Γέμισε τον πίνακα M· πέρασμα προς τα πίσω για τα ίδια τα αιτήματα.
Πολυπλοκότητα
O(n log n)
Κλασική παγίδα
Ο άπληστος «μικρότερος χρόνος λήξης» (L11) ΑΠΟΤΥΓΧΑΝΕΙ με βαρύτητες — μια φθηνή πρώιμη εργασία μπλοκάρει μια ακριβή. Η αφελής αναδρομή χωρίς memoization είναι εκθετική· ο πίνακας M την κάνει γραμμική.

Κλείδωσε τη γνώση

Βάλε στη σειρά τα βήματα του DP για τον σταθμισμένο χρονοπρογραμματισμό:

Βάλε τα βήματα στη σειρά
Ο αλγόριθμος DP για τον σταθμισμένο χρονοπρογραμματισμό, από την πρώτη ενέργεια στην τελευταία.
Σύρε τις γραμμές για αναδιάταξη — ή χρησιμοποίησε τα βελάκια.
1.Για j = 1 έως n, θέσε M[j] = max{ vⱼ + M[p(j)], M[j−1] }.
2.Υπολόγισε για κάθε j το p(j) — το τελευταίο συμβατό προηγούμενο αίτημα.
3.Κάνε πέρασμα προς τα πίσω για να βρεις ποια αιτήματα την πετυχαίνουν.
4.Θέσε M[0] = 0.
5.Ταξινόμησε τα αιτήματα κατά αύξοντα χρόνο λήξης.
6.Η βέλτιστη τιμή είναι το M[n].

Και συμπλήρωσε τα κενά:

Συμπλήρωσε τα κενά
Η ιδέα του δυναμικού προγραμματισμού σε τέσσερις λέξεις-κλειδιά.
Ο δυναμικός προγραμματισμός διασπά ένα πρόβλημα σε υποπροβλήματα. Με την τεχνική της λύνουμε κάθε υποπρόβλημα μία μόνο φορά. Στον σταθμισμένο χρονοπρογραμματισμό, η αναδρομή εκφράζει τη δυαδική επιλογή «το αίτημα j ή έξω;», και η βέλτιστη τιμή βρίσκεται τελικά στη θέση M[].

Μοτίβο σκέψης

Τι μάθαμε

Τι κρατάμε από αυτή τη διάλεξη

  1. Δυναμικός προγραμματισμός — διάσπαση σε επικαλυπτόμενα υποπροβλήματα· λύσε καθένα μία φορά, αποθήκευσέ το.
  2. Fibonacci — αφελής αναδρομή λόγω επικάλυψης· memoization.
  3. Σταθμισμένος χρονοπρογραμματισμός — μέγιστη βαρύτητα συμβατών αιτημάτων. Ο άπληστος αποτυγχάνει.
  4. = το τελευταίο συμβατό προηγούμενο αίτημα. Αναδρομή: .
  5. Χρόνος — η ταξινόμηση κυριαρχεί· τα βγαίνουν σε με σάρωση δύο δεικτών, και η εύρεση της λύσης σε με πέρασμα προς τα πίσω.
  6. Η συνταγή DP (4 βήματα): δομή → αναδρομικός ορισμός → υπολογισμός τιμής → κατασκευή λύσης.
Επόμενο
L15 · DP II — knapsack family

Ασκήσεις από εξετάσεις

Από τη θεωρία στην εξεταστική

10 άσκησεις που χρησιμοποιούν ως τελευταίο εργαλείο αυτή τη διάλεξη. Οι πρόσφατες εξεταστικές (2024/2025) φέρουν badge προτεραιότητας.

Παλαιό θέμαΙούνιος 2025Θέμα Εξετάσεων 2025Θέμα 1.73%Δυναμικός προγραμματισμόςΜέτριο

Ιούνιος 2025 · Θέμα 1.7 — Πολυπλοκότητα δισδιάστατου πίνακα DP

Λύνουμε ένα πρόβλημα με δυναμικό προγραμματισμό συμπληρώνοντας έναν πίνακα με τιμές , για και . Ποια από τα παρακάτω μπορούμε να πούμε με βεβαιότητα ότι δεν αντικατοπτρίζει τη χρονική πολυπλοκότητα;

(i) · (ii) · (iii) · (iv) .

Απαιτεί:L14 · DP I
Παλαιό θέμαΙούνιος 2025Θέμα Εξετάσεων 2025Θέμα 1.83%Δυναμικός προγραμματισμόςΜέτριο

Ιούνιος 2025 · Θέμα 1.8 — Πολυπλοκότητα μονοδιάστατου πίνακα DP

Όμοια, λύνουμε ένα πρόβλημα με DP συμπληρώνοντας έναν πίνακα τιμών για . Ποια μπορούμε να πούμε με βεβαιότητα ότι δεν αντικατοπτρίζει τη χρονική πολυπλοκότητα;

(i) · (ii) · (iii) · (iv) .

Απαιτεί:L14 · DP I
Παλαιό θέμαΙούνιος 2025Θέμα Εξετάσεων 2025Θέμα 320%Δυναμικός προγραμματισμόςΜέτριο

Ιούνιος 2025 · Θέμα 3 — Επίσκεψη αξιοθέατων (DP)

Θέλουμε να επισκεφτούμε μία ακολουθία από αξιοθέατα σε μία πόλη. Οι μόνες επιλογές μετακίνησης είναι ταξί ή ηλεκτρικό πατίνι, του οποίου η μίσθωση ισχύει για 4 διαδρομές. Με ταξί, η μετάβαση από το στο κοστίζει (η μετάβαση στο πρώτο αξιοθέατο είναι δωρεάν). Η ενοικίαση πατινιού κοστίζει σταθερά . Ορίζουμε = το ελάχιστο κόστος για να επισκεφθούμε τα .

(i) Ποια τιμή δίνει το ελάχιστο συνολικό κόστος; (ii) Όρισε αναδρομικά το . (iii) Ποια είναι η χρονική πολυπλοκότητα και γιατί;

Απαιτεί:L14 · DP I
Παλαιό θέμαΣεπτέμβριος 2025Θέμα Εξετάσεων 2025Θέμα 1.63%Δυναμικός προγραμματισμόςΜέτριο

Σεπτέμβριος 2025 · Θέμα 1.6 — Πολυπλοκότητα δισδιάστατου πίνακα DP

Λύνουμε ένα πρόβλημα με DP συμπληρώνοντας έναν πίνακα τιμών , για , . Ποιες επιλογές μπορούμε να πούμε με βεβαιότητα ότι δεν αντικατοπτρίζουν τη χρονική πολυπλοκότητα;

(i) · (ii) · (iii) · (iv) .

Απαιτεί:L14 · DP I
Παλαιό θέμαΣεπτέμβριος 2025Θέμα Εξετάσεων 2025Θέμα 1.73%Δυναμικός προγραμματισμόςΕύκολο

Σεπτέμβριος 2025 · Θέμα 1.7 — Πολυπλοκότητα μονοδιάστατου πίνακα DP

Λύνουμε ένα πρόβλημα με DP συμπληρώνοντας έναν πίνακα τιμών για . Ποιες μπορούμε να πούμε με βεβαιότητα ότι δεν αντικατοπτρίζουν τη χρονική πολυπλοκότητα; (i) · (ii) · (iii) · (iv) .

Απαιτεί:L14 · DP I
Από φροντιστήριοΦροντιστήριο 2023–24Άσκηση 3Δυναμικός προγραμματισμόςΜέτριο

Φροντιστηριακό Σετ #8 · Άσκηση 3 — Τεμαχισμός ράβδου (rod cutting)

Το πρόβλημα τεμαχισμού μιας ράβδου: δίνεται μια ράβδος μήκους cm, και το κέρδος πώλησης για κάθε δυνατό μήκος τμήματος ( για τμήμα μήκους ). Δώσε αλγόριθμο που βρίσκει τον πιο επικερδή τρόπο τεμαχισμού.

Απαιτεί:L14 · DP I
Από φροντιστήριοΦροντιστήριο 2023–24Άσκηση 4Δυναμικός προγραμματισμόςΜέτριο

Φροντιστηριακό Σετ #8 · Άσκηση 4 — Άνοιγμα εστιατορίων κατά μήκος δρόμου

Σκέφτεστε να ανοίξετε μια σειρά εστιατορίων κατά μήκος ενός αυτοκινητόδρομου. Οι πιθανές τοποθεσίες σχηματίζουν ευθεία γραμμή, με αποστάσεις από την αρχή (σε χιλιόμετρα, κατά αύξουσα σειρά) . Σε κάθε τοποθεσία μπορείτε να ανοίξετε το πολύ ένα εστιατόριο· το προσδοκώμενο κέρδος από το άνοιγμα στην τοποθεσία είναι . Δύο οποιαδήποτε εστιατόρια πρέπει να απέχουν τουλάχιστον χιλιόμετρα. Δώστε αποδοτικό αλγόριθμο για τον υπολογισμό του μέγιστου συνολικού κέρδους.

Απαιτεί:L14 · DP I
Παλαιό θέμαΙούνιος 2023Θέμα 440%Δυναμικός προγραμματισμόςΔύσκολο

Ιούνιος 2023 · Θέμα 4 — Κολώνες φωτισμού (μέγιστο ανεξάρτητο σύνολο σε μονοπάτι)

Ο δήμος θέλει να εγκαταστήσει κολώνες φωτισμού σε πιθανές θέσεις κατά μήκος ενός δρόμου. Για εξοικονόμηση κόστους δεν τοποθετεί κολώνες σε δύο διαδοχικές θέσεις. Κάθε θέση έχει φωτεινότητα · στόχος είναι ένα υποσύνολο μη-διαδοχικών θέσεων με τη μέγιστη συνολική φωτεινότητα («μέγιστο ανεξάρτητο υποσύνολο»).

Παράδειγμα 7 θέσεων με φωτεινότητες (για ). Π.χ. τα ανεξάρτητα έχουν φωτεινότητες .

1. Ο εξής άπληστος αλγόριθμος επιλέγει το καλύτερο ανάμεσα στο σύνολο των κορυφών με περιττούς δείκτες και σε αυτό με άρτιους δείκτες. Είναι βέλτιστος; Αν όχι, δώσε αντιπαράδειγμα. 2. Σχεδίασε αλγόριθμο δυναμικού προγραμματισμού που βρίσκει τη μέγιστη συνολική φωτεινότητα (δώσε την αναδρομική σχέση). 3. Δώσε τον χρόνο εκτέλεσης — πρέπει να είναι πολυωνυμικός ως προς το και ανεξάρτητος των τιμών φωτεινότητας. 4. Εκτέλεσε τον αλγόριθμο στο παραπάνω παράδειγμα.

Απαιτεί:L14 · DP I
Παλαιό θέμαΣεπτέμβριος 2023Θέμα 235%Δυναμικός προγραμματισμόςΔύσκολο

Σεπτέμβριος 2023 · Θέμα 2 — Χρονοπρογραμματισμός με βάρη (πλατφόρμα δόνησης)

Το γυμναστήριο της γειτονιάς σας απέκτησε πρόσφατα μια υπερσύγχρονη πλατφόρμα δόνησης, ένα πολύ ακριβό όργανο που υπόσχεται μυϊκή ενδυνάμωση. Πολλοί αθλούμενοι θέλουν να τη χρησιμοποιήσουν: κάθε αίτημα χαρακτηρίζεται από έναν χρόνο έναρξης , έναν χρόνο λήξης και μια συνδρομή που είναι διατεθειμένος να πληρώσει. Υπάρχει μόνο μία πλατφόρμα, οπότε δεν μπορούν να εξυπηρετηθούν δύο αιτήματα που επικαλύπτονται χρονικά. Το γυμναστήριο θέλει να επιλέξει ένα υποσύνολο μη επικαλυπτόμενων αιτημάτων ώστε να μεγιστοποιηθεί το συνολικό άθροισμα των συνδρομών.

(Α) Θεωρήστε τον εξής άπληστο αλγόριθμο: ταξινόμησε τα αιτήματα κατά φθίνουσα συνδρομή, διάλεξε το πρώτο, και κατόπιν, σαρώνοντας τη λίστα, διάλεξε κάθε επόμενο αίτημα που είναι συμβατό (δεν επικαλύπτεται) με όσα έχεις ήδη επιλέξει. Επιλύει ο αλγόριθμος αυτός το παραπάνω πρόβλημα; Αν όχι, δώστε αντιπαράδειγμα.

(Β) Βρείτε την τιμή (συνολικό άθροισμα των συνδρομών) της βέλτιστης λύσης.

Σημείωση μεταγραφής: το πρωτότυπο είναι αχνό σκαναρισμένο φύλλο με αιτήματα. Παρακάτω διδάσκουμε πλήρως τη μέθοδο και τη δουλεύουμε σε ένα καθαρό, αντιπροσωπευτικό στιγμιότυπο.

Απαιτεί:L14 · DP I
Παλαιό θέμαΙούνιος 2022Θέμα 235%Δυναμικός προγραμματισμόςΜέτριο

Ιούνιος 2022 · Θέμα 2 — Αναδρομή vs δυναμικός προγραμματισμός

Θέλουμε να υπολογιστεί η ακολουθία που προκύπτει από τον αναδρομικό τύπο

με τους 3 αρχικούς όρους . Έστω ο αλγόριθμος που στηρίζεται απευθείας στην αναδρομική σχέση. (Δίνεται ότι .)

i. Γράψτε σε φυσική γλώσσα τον αλγόριθμο . ii. Δείξτε ότι ο είναι εκθετικός, με πολυπλοκότητα . iii. Αν χρησιμοποιήσουμε δυναμικό προγραμματισμό (αλγόριθμος ), πόσα υποπροβλήματα θα οριστούν; iv. Δικαιολογήστε ότι η πολυπλοκότητα του είναι γραμμική. v. Ποιος αλγόριθμος είναι ταχύτερος;

Απαιτεί:L14 · DP I
Φόρτωση σχολίων…
L14 · Δυναμικός Προγραμματισμός I — Memoization & Σταθμισμένος Χρονοπρογραμματισμός · Algorithms Class Hub