Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP.

Slides:



Advertisements
Liknende presentasjoner
C++ for Java-programmerere
Advertisements

Høgskolen i Oslo Webprogrammering Grunnleggende PHP.
Kompilatorer - Hva foregår under panseret? BEKK fagdag
@ TDT4120 Algoritmer og datastrukturer Trær og søking i dem, samt litt diverse emner Åsmund Eldhuset asmunde idi.ntnu.no.
TDT4120 Algoritmer og datastrukturer Trær og søking i dem, samt litt diverse emner Kristian Veøy
Tallet e - Funksjonen e x Eksponensialfunksjon Eks: Mobiltlf – sms [1/5] La oss tenke oss at vi er 7 milliarder mennesker på jorden og at alle har hver.
Kap 5 The discounted cash flow approach
MATLAB En kort innføring/repetisjon SIF8001-SIF8005 Høsten 2001.
UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i: INF 4130: Algoritmer: Design og effektivitet Eksamensdag:15. desember 2010.
Introduksjon til MATLAB
Memoisering og dynamisk programmering
Nødhjelp i Matlab-programmering
C# for javaprogrammerere
Forside Korteste sti BFS Modifikasjon Dijkstra Eksempel Korrekthet Analyse Øving Spørsmål Dijkstras algoritme Åsmund Eldhuset asmunde *at* stud.ntnu.no.
@ TDT4120 Algoritmer og datastrukturer Trær og søking i dem, samt litt diverse emner Åsmund Eldhuset asmunde idi.ntnu.no.
@ TDT4120 Algoritmer og datastrukturer Introduksjon til øvingsopplegg og programmering i Python Åsmund Eldhuset asmunde stud.ntnu.no.
Dijkstras algoritme Åsmund Eldhuset asmunde *at* stud.ntnu.no
Forside A: Diverse B: O -,  - og  -relasjoner C: Pseudo- polynomialitet D: Transitivitet E: Diverse Spørsmål Teoriøving 5, oppgave 1 Åsmund Eldhuset.
Forside Introduksjon Fibonacci-tall Memoisering DP Neste uke Spørsmål Introduksjon til memoisering og dynamisk programmering Åsmund Eldhuset asmunde *at*
1 Øvingsforelesning Andreas Knudsen Nils Grimsmo
Alg. Dat Øvingsforelesning 5 Kompleksitetsanalyse Torbjørn Moralnd
Kompleksitetsanalyse
Korrekt dybde først-søk
Øvingsforelesning 12 Redusering av problemer,
Åsmund Eldhuset asmunde stud.ntnu.no folk.ntnu.no/asmunde/algdat/
TDT4120 Algoritmer og datastrukturer Introduksjon til øvingsopplegg og programmering i Python Basert på foiler av Åsmund Eldhuset Flikket på og presentert.
Forside Motivasjon Analyse Forside Motivasjon Analyse  -notasjon O og  Relasjoner Klasser Fallgruver Spørsmål Kompleksitetsanalyse Åsmund Eldhuset asmunde.
Generelt I/O if/else Funksjoner Lists Løkker Dictionaries Annet Listebehandling Klasser Python med noen algdat-anvendelser Åsmund Eldhuset asmunde *at*
The Postmans Problem. LOG530 Distribusjonsplanlegging 2 2 Mista har fått i oppdrag å vedlikeholde veiene i landsdelen. Dette er et eksempel på den klassiske.
Klargjøring fra forrige gang
Kapittel 11 Rekursjon Å tenke rekursivt Rekursjon er ein programmeringsteknikk der ein metode kallar seg sjølv for å fullføre ei oppgåve For å kunne.
Algoritmer og Datastrukturer
Kap 10 Graf.
Design patterns: State og Strategy
Dynamisk programmering
Trenger vi IT-faget i den videregående skolen i Norge
INF 295 Algoritmer og datastrukturer Forelesning 1 - kapittel 1 Introduksjon Hans F. Nordhaug (Ola Bø) (Ketil Danielsen, 2007)
INF 295 Algoritmer og datastrukturer Forelesning 4 Algoritmeanalyse Hans Fr. Nordhaug (Ola Bø)
INF 295 Forelesning 19 - Dynamisk programmering Korteste vei alle til alle (Floyd) Hans Fr. Nordhaug (Ola Bø)
Dynamiske nettsider PHP Del 2 – Kontrollstrukturer.
VI LAGER EN PLATEBUTIKK
Magnus Haug Algoritmer og Datastrukturer
AI - Kunstig Intelligens
Typer i programmering. Simple typer var a = 13;
MENA1000 Deleksamen 2012 Endelig statistikk. Deleksamen-resultatet i prosent av oppnåelig (x-aksen er ikke kandidatnummer, bare et løpenummer)
Alg. Dat Øvingsforelesning 11 Dynamisk programmering, grådighet
INF 295 Algoritmer og datastrukturer Forelesning 5 Algoritmeanalyse Hans Fr. Nordhaug (Ola Bø)
INF 295 Algoritmer og datastrukturer Forelesning 22 Teknikker for algoritmeutvikling Hans Fr. Nordhaug/ Ola Bø.
Presentasjon av prosjekt Oppgavestiller: NTNU (Magnar Hole) Oppgave: Opprette lokal brukerdatabase med (PHP & MySQL) Studenter: Christian Dillner Veileder:
Nummer 8-10 H. Aschehoug & Co Sehesteds gate 3, 0102 Oslo
Algebraens og Geometriens Historie
Algebraens og Geometriens Historie Retorisk algebra Synkopert algebra Symbolsk algebra Arkimedes Gamle Hellas.
Memoisering og dynamisk programmering Magnus Botnan botnan at stud.ntnu.no 23/
Roboter og matematikk!. beregne omkretsen på forskjellige hjul lage en testbane etter oppgitte mål beskrive en sammenheng med hjulenes omkrets, og kjørt.
Det gylne snitt og Fibonacci-tallene Undervisningsopplegg laget av Johan Nygaard for Vitenfabrikken i Sandnes.
Øvingsforelesning 11 P vs NP Håkon Jacobsen
Matematikk - utvidet form. Mål for timen Du skal kunne kjenne igjen plassverdien til et siffer og skrive et tall på utvidet form.
Brøk Regneartene.
Koding med Blue- bot, vigra barnehage,15. mars 2017
Kompleksitetsanalyse
Øvingsforelesning i Python (TDT4110)
Algebra er bra – hva er algebra?
Hva er nytt? De fire regneartene..
Multiplikasjon - Leksjon 1: Sammenheng mellom multiplikasjon og divisjon Lekse til mandag.
Multiplikasjon - Leksjon 3: fremgangsmåte/algoritme oppstilt multiplikasjon Lekse til torsdag.
Statistikk 2 Sentral- og spredningsmål
Algebrabrikker Sigbjørn Hals.
Øvingsforelesning 10 Grådighet
Objektorientert programmering i Java
Begynnerkurs i Python Realfagskonferansen 2019 Henrik H. Løvold
Utskrift av presentasjonen:

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP Memoisering og dynamisk programmering Åsmund Eldhuset asmunde *at* stud.ntnu.no folk.ntnu.no/asmunde/algdat/dp.ppt ::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP Memoisering og DP Dette er to ganske like teknikker for å lage algoritmer De kan brukes på svært mange tilsynelatende forskjellige problemer Kan gjøre eksponentiell kjøretid om til polynomisk kjøretid Vi vil nå "finne opp" memoisering og DP mens vi løser et problem ::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP Fibonacci-tall Problem: Regn ut Fibonacci-tall nummer n Matematisk definisjon: f(0) = 0 f(1) = 1 f(n) = f(n – 1) + f(n – 2) for n > 1 Hvert tall unntatt de to første er altså summen av de to foregående: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP Fibonacci-tall Dette ser lett ut å programmere. Vi fyrer løs med følgende Python-kode: def f(n): if n <= 0: return 0 elif n == 1: return 1 else: return f(n - 1) + f(n - 2) ::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP Fibonacci-tall Dessverre blir kjøretiden helt forferdelig! For n < 20 går det bra Utregning av f(25) tar et halvt sekund f(30) tar fem sekunder f(35) tar et minutt f(42) vil vare ut forelesningen f(50) vil ta et år Når n øker med 1, dobles nesten kjøretiden Hva skyldes dette? La oss ta en kikk på hva funksjonen gjør ::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP Bortkasting av arbeid f(3)f(2)f(1) f(0)f(1) f(2) f(1) f(0) f(4) f(2)f(1) f(0)f(1) f(3) f(6)f(5)f(4)f(3)f(2)f(1) f(0)f(1) f(2)f(1) f(0) ::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP Memoisering Løsning: Når funksjonen har regnet ut et Fibonacci-tall, registrerer vi resultatet Når funksjonen blir bedt om å regne ut et Fibonacci-tall, sjekker vi først om vi allerede har regnet det ut Har vi allerede regnet det ut, returnerer vi resultatet vi har Ellers starter vi utregningen på vanlig måte Kan bruke enten dictionary eller array Array er raskere, men du må vite størrelsen på forhånd ::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP Memoisering med dictionary def f(n, dict): if n <= 0: return 0 elif n == 1: return 1 elif dict.has_key(n): return dict[n] else: result = f(n – 1, dict) + f(n – 2, dict) dict[n] = result return result def fib(n): dict = {} return f(n, dict) ::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP Memoisering med array def f(n, array): if n <= 0: return 0 elif n == 1: return 1 elif array[n] != -1: return array[n] else: result = f(n – 1, array) \ + f(n – 2, array) array[n] = result return result def fib(n): array = [-1] * (n + 1) return f(n, array) ::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP Dynamisk programmering Vi ser at utregningen av hvert tall bare avhenger av tidligere tall Derfor kan vi faktisk fylle ut arrayet vårt direkte Går raskere enn memoisering pga. ingen rekursjon ::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP Dynamisk programmering def f(n): if n <= 0: return 0 array = [-1] * (n + 1) array[0] = 0 array[1] = 1 for i in xrange(2, n + 1): array[i] = array[i – 1] + array[i – 2] return array[n] ::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP DP – plassoptimalisering Vi ser at utregningen av hvert tall bare avhenger av de to forrige tallene Dermed klarer vi oss med bare å lagre tre tall av gangen – sparer minne Merk at dette bare er nyttig hvis man kun er interessert i det siste tallet, og ikke vil beholde tallene underveis ::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP DP – plassoptimalisering def f(n): if n <= 0: return 0 previous = 0 current = 1 for i in xrange(n – 1): next = previous + current previous = current current = next return current ::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP Rekursiv problemformulering Det gjelder å formulere løsningen av et problem som en kombinasjon av løsninger av mindre utgaver av samme problem Eksempel: Fibonacci-tall nummer n er summen av Fibonacci-tall nummer n - 1 og Fibonacci-tall nummer n - 2 De mindre utgavene kalles delproblemer ::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP Longest increasing subsequence (LIS) Problem: Gitt en rekke med n reelle tall a 1, a 2, a 3,..., a n, finn den største delrekken slik at tallene står i stigende rekkefølge Eksempel: [1, 2, 9, 3, 8, 5, 7] Fungerer en grådig algoritme? Nei, fordi delproblemene ikke er uavhengige. Velger man å ta med et bestemt tall, har man lagt begrensninger på hvilke tall man kan få med seg senere :: :: ::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP LIS – optimal substruktur Vi observerer at en LIS for en bestemt liste består av en LIS for en mindre del av listen Eksempel: [1, 2, 9, 3, 8, 5, 7] LIS'en er [1, 2, 3, 5, 7] [1, 2, 3, 5] er en LIS for [1, 2, 9, 3, 8, 5] [1, 2, 3] er en LIS for [1, 2, 9, 3] [1, 2] er en LIS for [1, 2] [1] er en LIS for [1] Konklusjon: en optimal løsning av problemet består av optimale løsninger av delproblemer :: :: ::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP LIS – rekursiv definisjon La oss se på problemet med å finne en LIS som slutter med tall nummer i, og la oss kalle lengden av dette for L(i) Da vil hovedproblemet vårt være å finne det beste av L(1), L(2), L(3),..., L(n) Hvordan regner vi ut L(i) ? :: :: ::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP LIS – rekursiv definisjon Vi finner lengste delsekvensen som ikke inneholder tall større enn tall nummer i Altså: vi må finne den j som er slik at j < i, a j  a i, og L(j) er størst mulig L(i) er da lik den største L(j) pluss 1 L(i) = max(L(j) : 0  j < i  a j  a i ) + 1 Hvis alle tallene på plasser til venstre for i er mindre enn a i, er L(i) = 1. Dette kan bygges inn i definisjonen over, eller så kan man innføre et ekstra element a 0 = -  og definere at L(0) = 0 :: :: ::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP LIS – tabellutfylling [1, 2, 9, 3, 8, 5, 7] [0, -, -, -, -, -, -, -] [0, 1, -, -, -, -, -, -] [0, 1, 2, -, -, -, -, -] [0, 1, 2, 3, -, -, -, -] [0, 1, 2, 3, 3, -, -, -] [0, 1, 2, 3, 3, 4, -, -] [0, 1, 2, 3, 3, 4, 4, -] [0, 1, 2, 3, 3, 4, 4, 5] :: :: ::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP LIS – sporing Nå har vi funnet lengden på LIS'en, men det hadde jo vært kjekt å finne selve LIS'en også... I et array P registrerer vi hvilket delproblem hvert delproblem benyttet a: [1, 2, 9, 3, 8, 5, 7] L: [0, 1, 2, 3, 3, 4, 4, 5] P: [-, 0, 1, 2, 2, 4, 4, 6] :: :: ::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP LIS – implementasjon def LIS(a): n = len(a) a.insert(0, -1) # A "fake" element to make #the real elements start at index 1 L = [0] * (n + 1) P = [-1] * (n + 1) for i in range(1, n + 1): bestIndex = 0 for j in range(1, i): if a[j] <= a[i] and \ L[j] > L[bestIndex]: bestIndex = j L[i] = L[bestIndex] + 1 P[i] = bestIndex return L, P :: :: ::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP LIS – implementasjon Koden på forrige lysbilde returnerer både lengde-arrayet L og forgjenger-arrayet P Det er ikke sikkert at LIS'en slutter med det siste tallet, så vi må gå gjennom L for å finne den største lengden Når vi har gjort det, kan vi spore oss tilbake gjennom P for å finne selve LIS'en Dette kan gjøres iterativt eller rekursivt :: :: ::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP LIS – implementasjon def LIS_result(a, L, P): bestIndex = 1 for i in xrange(2, len(L)): if L[i] > L[bestIndex]: bestIndex = i # Use make_LIS_recursively # or make_LIS_iteratively # (from the next slide) return make_LIS(a, P, bestIndex) # Example of use a = [1, 2, 9, 3, 8, 5, 7, 1] L, P = LIS(a) print LIS_result(a, L, P) # Should print [1, 2, 3, 5, 7] :: :: ::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP LIS – implementasjon def make_LIS_recursively(a, P, i): if i == 0: return [] else: b = make_LIS_recursively(a, P, P[i]) b.append(a[i]) return b def make_LIS_iteratively(a, P, i): b = [] while i != 0: b.append(a[i]) i = P[i] b.reverse() return b :: :: ::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP Betingelse 1: Optimal substruktur Ofte har vi en situasjon hvor vi ønsker å finne den best mulige løsningen av et problem Skal vi kunne bruke DP, må det være slik at problemet har en optimal substruktur – en optimal løsning av hele problemet består av optimale løsninger av delproblemer Når vi løser et delproblem, må vi som regel se gjennom alle de mindre delproblemene og velge det beste ::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP Betingelse 1.5: Uavhengige delproblemer Løsningen av ett delproblem må ikke legge begrensninger på hvordan andre delproblemer kan løses – delproblemer må ikke ha felles ressurser som kan spises opp (Anti)eksempel: Longest simple path Man skulle tro at en LSP fra a til b må bestå av en LSP fra a til x og fra x til b – men det er ikke sikkert, for hvis disse LSP'ene overlapper, kan de ikke kombineres til en lovlig LSP fra a til b. Vi har altså ikke optimal substruktur, og det skyldes at vi ikke har uavhengige delproblemer – fordi en LSP fra a til x, risikerer vi å "bruke opp" noder som LSP fra x til b trenger. ::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP Betingelse 2: Overlappende delproblemer Det burde muligens heller hete "gjentatte delproblemer" Løsningen av to forskjellige delproblemer kan involvere løsning av ett eller flere felles delproblemer Derfor blir rekursjon uten memoisering ekstremt ineffektivt fordi det samme arbeidet gjøres gang på gang Dersom delproblemene ikke overlapper, kan en splitt-og-hersk-algoritme brukes ::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP (Betingelse 3: Antall delproblemer) Det er bare vits i DP hvis antallet delproblemer er "lite" nok til at vi kan lagre alle svarene i minnet og får løst alle delproblemene raskt nok ::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP Ting å være oppmerksom på DP fungerer som regel bare på problemer der ting må komme i en bestemt rekkefølge, eller hvor du står fritt til å plukke en rekkefølge selv (slik som Floyd- Warshall gjør) Selv om DP tilsynelatende gir polynomisk kjøretid, kan det fremdeles være eksponentielt i inputstørrelsen! (f.eks. myntutdeling eller 0/1 knapsack) ::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP Matrisemultiplikasjon Eksempel: Regne ut A 1 A 2 A 3 A 4 A 5 Dimensjonene må passe ( a × b, b × c, c × d, d × e, e × f ) Matrisemultiplikasjon er ikke kommutativt (du kan ikke bytte om på rekkefølgen) Men det er assosiativt (du kan velge i hvilken rekkefølge du utfører multiplikasjonene) Vi kan kontrollere multiplikasjons- rekkefølgen ved å sette på parenteser: A 1 A 2 A 3 A 4 A 5 = A 1 ((A 2 A 3 )(A 4 A 5 )) = ((A 1 A 2 )A 3 )( A 4 A 5 ) = A 1 (A 2 (A 3 (A 4 A 5 ))) =...::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP Matrisemultiplikasjon Multiplikasjon av to matriser med dimensjoner a × b og b × c gir abc skalar- multiplikasjoner (multiplikasjoner av tall) Forskjellige parentessettinger fører som regel til forskjellig totalt antall skalarmultiplikasjoner Hvilken parentessetting er best?::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP Matrisemultiplikasjon Fullt parentessatt uttrykk: enten en enkelt matrise eller et produkt av to utrykk som er fullt parentessatt Alle måter å multiplisere sammen matriser på kan skrives fullt parentessatt Den beste måten må derfor være et fullt parentessatt uttrykk – altså et produkt av to andre FPU, som selv må være optimale::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP Matrisemultiplikasjon Den ytterste multiplikasjonen kan settes på en av følgende måter: A 1 (A 2 A 3 A 4 A 5 ) (A 1 A 2 )(A 3 A 4 A 5 ) (A 1 A 2 A 3 )(A 4 A 5 ) (A 1 A 2 A 3 A 4 )A 5 For hver av disse mulighetene må vi (rekursivt) undersøke matrisegruppene vi får og finne optimal parentessetting for dem Vi har  (n 2 ) forskjellige matrisegrupper, så antallet delproblemer er overkommelig::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP Longest common subsequence (LCS) Finne lengste tegnsekvens som er felles for to strenger Eksempel: A = "abqaeehgpcydkpklz" B = "rwazxbaertctdz" Vi definerer LCS(i, j) til å være LCS'en til A[0:i] og B[0:j] :: :: ::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP Longest common subsequence (LCS) Dersom siste tegn i A[0:i] og B[0:j] er like, er disse en del av LCS(i, j); da trenger vi bare å finne LCS(i – 1, j – 1) og legge til 1 Hvis ikke, kan ikke begge de siste tegnene være med i LCS(i, j) Da er LCS(i, j) enten lik LCS(i – 1, j) eller LCS(i, j – 1) Vi får da en tabell over LCS(i, j) på m x n, hvor m er lengden til A og n er lengden til B :: :: ::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP Begge utnytter optimal substruktur Grådig Lokalt optimale valg er globalt optimale; optimal løsning avgjøres ut fra hva som virker best der og da Løses som regel ovenfra og ned; man tar et valg og ender opp med et mindre delproblem DP Optimal løsning avgjøres ved å se på optimale løsninger av delproblemer Løses nedenfra og opp; man løser større og større delproblemer ut i fra de mindre delløsningene ::

Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP Sammendrag: krav for DP Rekursiv struktur Optimal substruktur Overlappende delproblemer (hvis ikke: splitt og hersk-algoritme) Du vet ikke hvilket delproblem du skal benytte før du har løst alle delproblemene (hvis ikke: grådig algoritme) ::