Java Programare Dinamica

Embed Size (px)

Citation preview

  • 7/25/2019 Java Programare Dinamica

    1/153

  • 7/25/2019 Java Programare Dinamica

    2/153

  • 7/25/2019 Java Programare Dinamica

    3/153

    Se consider vectorul w = w

    1

    ,..., w

    n

    ).

    S se determine un

    subvector

    al lui w care nu conine

    elemente consecutive

    n w i are suma elementelor

    maxim

    Exemplu

    Pentru

    w = 1, 4, 7, 5)

    soluia este

    4, 5)

  • 7/25/2019 Java Programare Dinamica

    4/153

    Problem echivalent

    Se consider un graf de tip lan cu V =

    {v

    1

    ,..., v

    n

    }.

    V

    rfurile

    grafului au asociate ponderile w

    1

    ,..., respectiv w

    n

    .

    S se determine o mulime independent de vrfuri de

    pondere maxim

    ponderea unei mulimi de vrfuri = suma ponderilor vrfurilor

    1 4 7 5

  • 7/25/2019 Java Programare Dinamica

    5/153

    Aplicaii probleme de alocare de resurse cu evitarea

    interferenei (indicat prin muchii -> graf de conflicte)Ponderea asociat vrfurilor poate reprezenta cantitatea dedate pe care staia trebuie s o transmit

    Problem transmiterea cantitii maxime de date fr

    interferene

    Nu se cunosc algoritmi polinomiali n cazul general

    (NP-completitudine)

    Maximum Weighted Independent Set

  • 7/25/2019 Java Programare Dinamica

    6/153

    Abordare cu metoda Greedy

    La un pas este adugat n soluie vrful de ponderemaxim neadiacent cu cele deja selectate

    Soluia

    : {v3, v1} cu ponderile {7, 1} nu este optim

    1 4 7 5

  • 7/25/2019 Java Programare Dinamica

    7/153

    Abordare cu metoda Divide et Impera

    Incorectreuniunea soluiilor subproblemelor nu este o

    soluie posibil (corect) pentru problema iniial

    1 4 7 5

    4 7

  • 7/25/2019 Java Programare Dinamica

    8/153

    Cutarea exhaustiv a soluiei optime

    Generarea tuturor soluiilor posibile i determinarea celeioptime algoritm exponenial

  • 7/25/2019 Java Programare Dinamica

    9/153

    Problema nu se poate rezolva folosind metode

    deja studiate

  • 7/25/2019 Java Programare Dinamica

    10/153

    Analizm structura unei soluii optime, evideniind

    un element (primul/ultimul) al acesteia, pentru a

    determina subprobleme utile i relaii de recuren

  • 7/25/2019 Java Programare Dinamica

    11/153

    Fie S V = {v1,..., vn} o soluie optim

    Dac vnS S-{vn} este soluie optim pentru

    G-{vn, vn-1}

    Dac vnS S este soluie optim pentru

    G-{vn}

  • 7/25/2019 Java Programare Dinamica

    12/153

    Fie S V = {v1,..., vn} o soluie optim

    Dac vnS S-{vn} este soluie optim pentru

    G-{vn, vn-1}

    Dac vnS S este soluie optim pentru

    G-{vn}

  • 7/25/2019 Java Programare Dinamica

    13/153

    Fie S V = {v1,..., vn} o soluie optim

    Dac vnS S-{vn} este soluie optim pentru

    G-{vn, vn-1}

    Dac vnS S este soluie optim pentru

    G-{vn}

    Dac am tii deja soluiile pentru grafurile G-{vn

    , v

    n-1

    } i

    G-{v

    n

    }

    , am putea determina S alegnd dintre cele dou

    situaii cazul n care se obine soluia optim

  • 7/25/2019 Java Programare Dinamica

    14/153

    Recuren:

    Notm S(i) = ponderea maxim a unei mulimi

    independeten graful indus de vrfurile {v1,..., vi}

    S n) = max{ S n-2)+wn

    , S n-1)}

    S 1) = w1

    , S 0) = 0

  • 7/25/2019 Java Programare Dinamica

    15/153

    S(n)

    S(n-1) S(n-2)

    S(n-2) S(n-3) S(n-3) S(n-4)

    S(n-3) S(n-4)

    Subproblemele se repet algoritm exponenial

  • 7/25/2019 Java Programare Dinamica

    16/153

    S(n)

    S(n-1) S(n-2)

    S(n-2) S(n-3) S(n-3) S(n-4)

    S(n-3) S(n-4)

    Putem evita rezolvarea unei subprobleme de mai

    multe ori?

  • 7/25/2019 Java Programare Dinamica

    17/153

    Recuren:

    S n)= max{ S n-2)+w

    n

    , S n-1)}

    Memorm ntr-un vector rezultatele subproblemelor

    deja rezolvate memoizare)

    o subproblem va fi

    rezolvat o singur dat algoritm O(n)

  • 7/25/2019 Java Programare Dinamica

    18/153

    S(0) S(1)

    S(2)

    S(3)

    S(4)

  • 7/25/2019 Java Programare Dinamica

    19/153

    Mai eficientimplementare iterativ a recurenei

    (bottom-up)

  • 7/25/2019 Java Programare Dinamica

    20/153

  • 7/25/2019 Java Programare Dinamica

    21/153

    int Sol(int n){

    if(n==0) return 0;

    if(n==1) return w[1];

    if (s[n]==0) //nerezolvata

    s[n]= Math.max(Sol(n-2)+w[n],Sol(n-1));

    return s[n];

    }]; poz = i;}

    for(int i=0;i

  • 7/25/2019 Java Programare Dinamica

    22/153

  • 7/25/2019 Java Programare Dinamica

    23/153

    int SolNerec(int n){

    s[0] = 0;

    s[1] = w[1];

    for(int i=2;i

  • 7/25/2019 Java Programare Dinamica

    24/153

    Cum putem determina i o submulime optim, nu

    doar ponderea?

  • 7/25/2019 Java Programare Dinamica

    25/153

    Cum putem determina i o submulime optim, nu

    doar ponderea?

    Din relaia de recuren putem deduce ce vrfuri au

    fost selectate n soluie

    s[n]= max{ s[n-2]+w[n], s[n-1]}

    Dac s[n] = s[n-2]+w[n] , vrfuln se adaug n

    soluie i problema se reduce la primele n-2 vrfuri

    Dac s[n] = s[n-1], nu se adaug nici un vrf lasoluie i problema se reduce la primele n-1 vrfuri

  • 7/25/2019 Java Programare Dinamica

    26/153

    Cum putem determina i o submulime optim, nu

    doar ponderea?

    Din relaia de recuren putem deduce ce vrfuri au

    fost selectate n soluie

    s[n]= max{ s[n-2]+w[n], s[n-1]}

    Dac s[n] = s[n-2]+w[n] , vrfuln se adaug n

    soluie i problema se reduce la primele n-2 vrfuri

    Dac s[n] = s[n-1], nu se adaug nici un vrf lasoluie i problema se reduce la primele n-1 vrfuri

  • 7/25/2019 Java Programare Dinamica

    27/153

    static void SolNerecCuAfis(int n){

    int i;

    s[0]=0; s[1]=w[1];

    for(i=2;i1){

    if(s[i]==s[i-2]+w[i]){

    System.out.println(i+" de pondere "+w[i]);

    i=i-2;

    }

    else

    i=i-1;

    }

    if(i==1)

    System.out.println(i+" de pondere "+w[i]);

    }

  • 7/25/2019 Java Programare Dinamica

    28/153

    static void SolNerecCuAfis(int n){

    int i;

    s[0]=0; s[1]=w[1];

    for(i=2;i1){

    if(s[i]==s[i-2]+w[i]){

    System.out.println(i+" de pondere "+w[i]);

    i=i-2;

    }

    else

    i=i-1;

    }

    if(i==1)

    System.out.println(i+" de pondere "+w[i]);

    }

  • 7/25/2019 Java Programare Dinamica

    29/153

    static void SolNerecCuAfis(int n){

    int i;

    s[0]=0; s[1]=w[1];

    for(i=2;i1){

    if(s[i]==s[i-2]+w[i]){

    System.out.println(i+" de pondere "+w[i]);

    i=i-2;

    }

    else

    i=i-1;

    }

    if(i==1)

    System.out.println(i+" de pondere "+w[i]);

    }

  • 7/25/2019 Java Programare Dinamica

    30/153

  • 7/25/2019 Java Programare Dinamica

    31/153

    Greedy nu furnizeaz mereu soluia optim

    Alte exemple:

    Problema rucsacului, cazul discret

    Problema monedelor, cazul general

  • 7/25/2019 Java Programare Dinamica

    32/153

    Divide et Impera ineficient dac subproblemele se

    repet

  • 7/25/2019 Java Programare Dinamica

    33/153

    Exemplu - CalculmnumrulFibonacci F(n)F(n) = F(n-1)+F(n-2)

    F(0) = F(1) = 1

    F(4)F(4)

    F(3) F(2)

    F(2) F(1) F(1) F(0)

    F(1) F(0)

  • 7/25/2019 Java Programare Dinamica

    34/153

    Exemplu CalculmnumrulFibonacci F(n)F(n) = F(n-1)+F(n-2)

    F(0) = F(1) = 1

    F(4)F(4)

    F(3) F(2)

    F(2) F(1) F(1) F(0)

    F(1) F(0)

  • 7/25/2019 Java Programare Dinamica

    35/153

    Soluii

    reducere la subprobleme utile + relaii de recuren

    rezolvarea eficient a subproblemelor

    recursiv cu memoizare (salvarea rezultatelor subproblemelor

    deja rezolvate)

    algoritmi iterativi buttom-up

    Metoda programrii dinamice

  • 7/25/2019 Java Programare Dinamica

    36/153

  • 7/25/2019 Java Programare Dinamica

    37/153

    Probleme care presupun rezolvarea de relaii derecuren

    De obicei aceste relaii se obin din respectarea unuiprincipiu de optimalitate (subprobleme optime)

  • 7/25/2019 Java Programare Dinamica

    38/153

    Fie A i B dou mulimi oarecare (B = N, Z, R, {0,1} )

    Fiecrui xA urmeaz s i se asociezeo valoare v(x)B.

    x

    A v x)

    B

  • 7/25/2019 Java Programare Dinamica

    39/153

    Fie A i B dou mulimi oarecare (B = N, Z, R, {0,1} )

    Fiecrui xA urmeaz s i se asociezeo valoare v(x)B.

    x

    A v x)

    B

    v este cunoscutdoar pe submulimea XA

  • 7/25/2019 Java Programare Dinamica

    40/153

    Fie A i B dou mulimi oarecare (B = N, Z, R, {0,1} )

    Fiecrui xA urmeaz s i se asociezeo valoare v(x)B.

    x

    A v x)

    B

    v este cunoscutdoar pe submulimea XA

    Pentru fiecare x

    A\X avem relaiav x) = f

    x

    v a

    1

    ),...,v a

    k

    ))

    unde

    A

    x

    = {a

    1

    ,...,a

    k

    }

    este mulimea elementelor din A de a cror valoaredepinde v(x)

  • 7/25/2019 Java Programare Dinamica

    41/153

    Dat zA, se cere s se calculeze, dac este posibil,valoarea v(z) - eficient

  • 7/25/2019 Java Programare Dinamica

    42/153

    Putem reprezenta problema pe un gr f de dependene.

    Vrfurile corespund elementelor din A, iar descendenii

    unui vrf x sunt vrfurile din Ax.

    valoarea lui x depide

    direct de v(ai)

    Problema are soluie numai dac n graful de dependene nu

    exist circuite accesibile din z

    a

    i

    x

  • 7/25/2019 Java Programare Dinamica

    43/153

    Calcul numrFibonacci FnF(n) = F(n-1)+F(n-2)

    F(0) = F(1) = 1

  • 7/25/2019 Java Programare Dinamica

    44/153

    Calcul numrFibonacci FnF(n) = F(n-1)+F(n-2)

    F(0) = F(1) = 1 X ={0, 1}

    0 1

    2

    3

    4

    tim iniial

  • 7/25/2019 Java Programare Dinamica

    45/153

    Alt exempluA = {1,2,...,5,6};

    v(1) = v(2) = 1v(3) = v(1) + v(2) + v(4)

    v(4) = v(1) + v(2)

    v(5) = v(2) + v(3)

    v(6) = v(1) + v(3) + v(4)

    v(6) = ?

  • 7/25/2019 Java Programare Dinamica

    46/153

    Alt exempluA = {1,2,...,5,6};

    v(1) = v(2) = 1 X = {1, 2}v(3) = v(1) + v(2) + v(4)

    v(4) = v(1) + v(2)

    v(5) = v(2) + v(3)

    v(6) = v(1) + v(3) + v(4)

    4

    3

    21

    6 5

  • 7/25/2019 Java Programare Dinamica

    47/153

    4

    3

    21

    6 5

    v(6) = ?

  • 7/25/2019 Java Programare Dinamica

    48/153

  • 7/25/2019 Java Programare Dinamica

    49/153

    Fie Gz graful indus de mulimea vrfurilory de a crorvaloare depinde v z) = pentru care exist un drum de la y laz = vrfuriobservabile din z

    Gz=

    graful vrfurilor observabile din z

    Problema presupune o parcurgere a grafului Gz

  • 7/25/2019 Java Programare Dinamica

    50/153

    4

    3

    21

    6

    v(6) = ?

    graful vrfurilor observabile

    din 6

  • 7/25/2019 Java Programare Dinamica

    51/153

    Ar fi bine dac

    am cunoate de la nceput Gz forma acestui graf ar permite o parcurgere mai simpl,

    care s conduc la calcularea valorii v(z).

  • 7/25/2019 Java Programare Dinamica

    52/153

    ncercarede rezolvare cu metoda Divide et Impera.

    procedure DivImp(x)for yAx\X {y de care x depinde direct}

    DivImp(y)

    calculeazv(x) conform funcieifx

    end;

  • 7/25/2019 Java Programare Dinamica

    53/153

    ncercare de rezolvare cu metoda Divide et Impera.

    procedure DivImp(x)for yAx\X {y de care x depinde direct}

    DivImp(y)

    calculeaz v(x) conform funciei fx

    end;

    algoritmul nu se termin pentru grafuri ciclice

    valoarea unui vrf poate fi calculat de mai multe ori

  • 7/25/2019 Java Programare Dinamica

    54/153

    Soluie - sortarea topologic pentru Gz ordinea

    ncare se

    calculeazvalorile v ale

    vrfurilor

    Ar fi mai bine dac forma grafului ar permite o

    parcurgere mai simpl.

  • 7/25/2019 Java Programare Dinamica

    55/153

    Metoda programrii dinamice const n urmtoarele:

    Se asociaz problemei un graf de dependene

  • 7/25/2019 Java Programare Dinamica

    56/153

    Metoda programrii dinamice const n urmtoarele:

    Se asociaz problemei un graf de dependene

  • 7/25/2019 Java Programare Dinamica

    57/153

    Metoda programrii dinamice const n urmtoarele:

    Se asociaz problemei un graf de dependene

    n graf este pus n eviden un graf de vrfuri observabiledin z, numit PD-arbore de rdcin z, cu proprietile

  • 7/25/2019 Java Programare Dinamica

    58/153

    Metoda programrii dinamice const n urmtoarele:

    Se asociaz problemei un graf de dependene

    n graf este pus n eviden un graf de vrfuri observabiledin z, numit PD-arbore de rdcin z, cu proprietile

    nu conine circuite

  • 7/25/2019 Java Programare Dinamica

    59/153

    Metoda programrii dinamice const n urmtoarele:

    Se asociaz problemei un graf de dependene

    n graf este pus n eviden un graf de vrfuri observabiledin z, numit PD-arbore de rdcin z, cu proprietile

    nu conine circuite

    mulimea vrfurilor cu gradul intern 0 (ale cror valorinu depind de o alt valoare) este inclus n X

  • 7/25/2019 Java Programare Dinamica

    60/153

    Metoda programrii dinamice const n urmtoarele:

    Se asociaz problemei un graf de dependene

    n graf este pus n eviden un graf de vrfuri observabiledin z, numit PD-arbore de rdcin z, cu proprietile

    nu conine circuite

    mulimea vrfurilor cu gradul intern 0 (ale cror valorinu depind de o alt valoare) este inclus n X

    se poate aeza pe niveluri (nivelul lui y = lungimea

    maxim a unui drum de la y la z)

  • 7/25/2019 Java Programare Dinamica

    61/153

    Metoda programrii dinamice const n urmtoarele:

    Se asociaz problemei un graf de dependene

    n graf este pus n eviden un graf de vrfuri observabiledin z, numit PD-arbore de rdcin z

    Se parcurgenpostordine PD-arborele

    procedurepostord(x)

    for jAx

    if viz[j]=false {diferenafade DI}

    postord(j)

    calculeazv(x) conform funcieif

    x;

    viz[x]true

    end

    Apelpostord(z)

  • 7/25/2019 Java Programare Dinamica

    62/153

    4

    3

    21

    6v(6) = ?

    Prin parcurgereanpostordine, vrfurilevor fisortate topologic

  • 7/25/2019 Java Programare Dinamica

    63/153

    Generalizeazmetoda Divide et Impera- dependenelenu au forma unui arbore, ci a unui PD-arbore.

  • 7/25/2019 Java Programare Dinamica

    64/153

    Generalizeazmetoda Divide et Impera- dependenelenu au forma unui arbore, ci a unui PD-arbore.

    Este util scutmnPD-arbore regulariticare sevite memorarea valorilor tuturor vrfurilori/sau ssimplifice parcurgereanpostordine.

  • 7/25/2019 Java Programare Dinamica

    65/153

    A = {0,...,n}, B =N

    X = {0,1} (tim F0=0; F1=1) v(k) = Fk, deci

    v(k) = v(k-1)+ v(k-2)

  • 7/25/2019 Java Programare Dinamica

    66/153

    A = {0,...,n}, B =N

    X = {0,1} (tim F0=0; F1=1) v(k) = Fk, deci

    v(k) = v(k-1)+ v(k-2)

    Ak = {k-1,k-2}, k2

    fk(a,b) = a + b, k2

  • 7/25/2019 Java Programare Dinamica

    67/153

    A = {1,...,n}, B =N N

    v(k) = (Fk-1, Fk) v(1) = (0, 1)

  • 7/25/2019 Java Programare Dinamica

    68/153

    A = {1,...,n}, B =N N

    v(k) = (Fk-1, Fk) v(1) = (0, 1)

    Ak = {k-1}, k2

    fk(a,b) = (b, a+b) k2

    v(k) = fk(v(k-1))

  • 7/25/2019 Java Programare Dinamica

    69/153

    A = {1,...,n}, B =N N

    v(k) = (Fk-1, Fk) v(1) = (0, 1)

    Ak = {k-1}, k2

    fk(a,b) = (b, a+b) k2

    v(k) = fk(v(k-1))

    a0; b1for i=2,n

    (a,b)(b,a+b)

    write(b)

  • 7/25/2019 Java Programare Dinamica

    70/153

    Se poate utiliza n problemele de optim care verific

    un principiu de optimalitate, din care se obin relaiilede calcul

    Fie secvena de stri S0 (starea iniial), S1, , Sn (stareafinal) ale sistemului.

  • 7/25/2019 Java Programare Dinamica

    71/153

    Fie soluiaoptim d1, ..., dnPrincipiul

    de optimalitate poate fi satisfcut sub una

    din urmtoarele forme:

    optim

    optim

    ambele subsecvenesunt optime

    ir optim

    d1 dn

  • 7/25/2019 Java Programare Dinamica

    72/153

    Fie soluiaoptim d1, ..., dnPrincipiul de optimalitate poate fi satisfcut sub una

    din urmtoarele forme:

    1 2(1) optim optim pentru subproblema

    cor

    , ,...., ,....

    espunzatoare,

    ,

    1

    kn nd d d d

    k n

    d

    1 12, ,...., ,....,(3) optim optim, 1

    opt

    si

    im,.. , 1, ..

    k

    k

    n

    n

    d d dd d k n

    d d k n

    11 2(2) optim, ,...., ,...., optim, 1knd d d d k d n

  • 7/25/2019 Java Programare Dinamica

    73/153

    Stabilirea subproblemelor utile (de exemplu dinprincipiul de optimalitate)

    Care subprobleme le putem rezolva direct

    Relaiile de recuren

    Ordinea de parcurgere a grafului de dependene

    ordinea de calcul)

  • 7/25/2019 Java Programare Dinamica

    74/153

  • 7/25/2019 Java Programare Dinamica

    75/153

    Se consider vectorul a = a

    1

    ,..., a

    n

    ).

    S se determine lungimea maxim a unui subir

    cresctor din a i un astfel de subir de lungime

    maxim

    Exemplu

    Pentru

    a = 8, 1, 7, 4, 6, 5, 11)

    lungimea maxim este 4, un subir fiind1, 4, 6, 11

  • 7/25/2019 Java Programare Dinamica

    76/153

    Longest Increasing Subsequence

    nrudit cu problema determinrii celui mai lung subir

    comun a dou iruri

    (Longest Common Subsequence)

    Aplicaii

    cautarea de tiparuri (patterns):

    baze de date maribioinformatica

    similitudinin genetic(ADN)

    sequence alignment

    Lavanya, B., Murugan, A.: Discovery of longest increasingsubsequences and its variants using DNA operations.

    International Journal of Engineering and Technology 5(2),

    11691177 (2013)

  • 7/25/2019 Java Programare Dinamica

    77/153

    Principiu de optimalitate:

    Dac

    ai1, ai2, , aip,

    este un subiroptim care ncepepe poziia

    i1, atunci:

    ai2, , aip

    este un

    subir

    optim care

    ncepe

    pe

    poziia

    i2;

    Mai general

    aik, , aip

    este un

    subir

    optim care

    ncepe

    pe

    poziia

    ik.

  • 7/25/2019 Java Programare Dinamica

    78/153

    Principiu de optimalitate

    Subprobleme:

    Calculmpentru fiecare poziiei lungimea maxima

    unui subircresctorce ncepepe poziiai (cu elementulai)

  • 7/25/2019 Java Programare Dinamica

    79/153

    Subproblem:

    lung[i] = lungimea maxima unui subir

    cresctorcencepepe poziiai

  • 7/25/2019 Java Programare Dinamica

    80/153

    Subproblem:

    lung[i] = lungimea maxima unui subir

    cresctorcencepepe poziiai

    Soluie problem:

    nr = max{lung[i]i = 1,2,,n}

  • 7/25/2019 Java Programare Dinamica

    81/153

    Subproblem:

    lung[i] = lungimea maxima unui subir

    cresctorcencepepe poziiai

    Soluie problem:

    nr = max{lung[i]i = 1,2,,n}

  • 7/25/2019 Java Programare Dinamica

    82/153

    Subproblem:

    lung[i] = lungimea maxima unui subir

    cresctorcencepepe poziiai

    tim direct

    Relaie de recuren

    Ordinea de parcurgere a grafului de dependene

    ordinea de calcul)

  • 7/25/2019 Java Programare Dinamica

    83/153

    Subproblem:

    lung[i] = lungimea maxima unui subir

    cresctorcencepepe poziiai

    tim direct lung[n] = 1

    Relaie de recuren

    lung[i] = 1 + max{lung[j]j>i , ai

  • 7/25/2019 Java Programare Dinamica

    84/153

    Subproblem:

    lung[i] = lungimea maxima unui subir

    cresctorcencepepe poziiai

    tim direct lung[n] = 1

    Relaie de recuren

    lung[i] = 1 + max{lung[j]j>i, ai

  • 7/25/2019 Java Programare Dinamica

    85/153

    Graful de dependen

    e

    i = n, n-1, , 1

    n

    2

    1

  • 7/25/2019 Java Programare Dinamica

    86/153

    Graful de dependen

    e

    Ordinea de parcurgere a grafului de dependene

    ordinea de calcul)

    i = n, n-1, ,1n, n-1, , 1

    n

    2

    1

  • 7/25/2019 Java Programare Dinamica

    87/153

    Cum determinmun subir maxim?

  • 7/25/2019 Java Programare Dinamica

    88/153

    Pentru a determina i un subir optimputem memoran plus

    succ[i] = indicele urmtorului elementdintr-un subir optim care ncepepe poziia i (n+1dac nu exist)

    =indicele pentru care se realizeaz

    maximul n relaia de recuren

  • 7/25/2019 Java Programare Dinamica

    89/153

    a: 8 1 7 4 6 5 11

    lung : 2 4 2 3 2 2

    succ : 7 4 7 5 7 7

    1 2 3 4 5 6 7

  • 7/25/2019 Java Programare Dinamica

    90/153

    a: 8 1 7 4 6 5 11

    lung : 2 4 2 3 2 2 1

    succ : 7 4 7 5 7 7 8

    1 2 3 4 5 6 7

  • 7/25/2019 Java Programare Dinamica

    91/153

    a: 8 1 7 4 6 5 11

    lung : 2 4 2 3 2 2 1

    succ : 7 4 7 5 7 7 8

    1 2 3 4 5 6 7

  • 7/25/2019 Java Programare Dinamica

    92/153

    a: 8 1 7 4 6 5 11

    lung : 2 4 2 3 2 2 1

    succ : 7 4 7 5 7 7 8

    1 2 3 4 5 6 7

  • 7/25/2019 Java Programare Dinamica

    93/153

    a: 8 1 7 4 6 5 11

    lung : 2 4 2 3 2 2 1

    succ : 7 4 7 5 7 7 8

    1 2 3 4 5 6 7

  • 7/25/2019 Java Programare Dinamica

    94/153

    a: 8 1 7 4 6 5 11

    lung : 2 4 2 3 2 2 1

    succ : 7 4 7 5 7 7 8

    1 2 3 4 5 6 7

  • 7/25/2019 Java Programare Dinamica

    95/153

    a: 8 1 7 4 6 5 11

    lung : 2 4 2 3 2 2 1

    succ : 7 4 7 5 7 7 8

    1 2 3 4 5 6 7

  • 7/25/2019 Java Programare Dinamica

    96/153

    a: 8 1 7 4 6 5 11

    lung : 2 4 2 3 2 2 1

    succ : 7 4 7 5 7 7 8

    1 2 3 4 5 6 7

  • 7/25/2019 Java Programare Dinamica

    97/153

    a: 8 1 7 4 6 5 11

    lung : 2 4 2 3 2 2 1

    succ : 7 4 7 5 7 7 8

    1 2 3 4 5 6 7

  • 7/25/2019 Java Programare Dinamica

    98/153

    a: 8 1 7 4 6 5 11

    lung : 2 4 2 3 2 2 1

    succ : 7 4 7 5 7 7 8

    1 2 3 4 5 6 7

  • 7/25/2019 Java Programare Dinamica

    99/153

    a: 8 1 7 4 6 5 11

    lung : 2 4 2 3 2 2 1

    succ : 7 4 7 5 7 7 8

    1 2 3 4 5 6 7

  • 7/25/2019 Java Programare Dinamica

    100/153

    a: 8 1 7 4 6 5 11

    lung : 2 4 2 3 2 2 1

    succ : 7 4 7 5 7 7 8

    1 2 3 4 5 6 7

  • 7/25/2019 Java Programare Dinamica

    101/153

    a: 8 1 7 4 6 5 11

    lung : 2 4 2 3 2 2 1

    succ : 7 4 7 5 7 7 8

    1 2 3 4 5 6 7

  • 7/25/2019 Java Programare Dinamica

    102/153

    a: 8 1 7 4 6 5 11

    lung : 2 4 2 3 2 2 1

    succ : 7 4 7 5 7 7 8

    1 2 3 4 5 6 7

  • 7/25/2019 Java Programare Dinamica

    103/153

    a: 8 1 7 4 6 5 11

    lung : 2 4 2 3 2 2 1

    succ : 7 4 7 5 7 7 8

    Solu

    ie

    : lung = 4

    1 2 3 4 5 6 7

  • 7/25/2019 Java Programare Dinamica

    104/153

    a: 8 1 7 4 6 5 11

    lung : 2 4 2 3 2 2 1

    succ : 7 4 7 5 7 7 8

    Sub

    ir

    : 1,

    1 2 3 4 5 6 7

  • 7/25/2019 Java Programare Dinamica

    105/153

    a: 8 1 7 4 6 5 11

    lung : 2 4 2 3 2 2 1

    succ : 7 4 7 5 7 7 8

    Sub

    ir

    : 1,

    1 2 3 4 5 6 7

  • 7/25/2019 Java Programare Dinamica

    106/153

    a: 8 1 7 4 6 5 11

    lung : 2 4 2 3 2 2 1

    succ : 7 4 7 5 7 7 8

    Sub

    ir

    : 1, 4,

    1 2 3 4 5 6 7

  • 7/25/2019 Java Programare Dinamica

    107/153

    a: 8 1 7 4 6 5 11

    lung : 2 4 2 3 2 2 1

    succ : 7 4 7 5 7 7 8

    Sub

    ir

    : 1, 4, 6

    1 2 3 4 5 6 7

  • 7/25/2019 Java Programare Dinamica

    108/153

    a: 8 1 7 4 6 5 11

    lung : 2 4 2 3 2 2 1

    succ : 7 4 7 5 7 7 8

    Sub

    ir

    : 1, 4, 6, 11

    1 2 3 4 5 6 7

  • 7/25/2019 Java Programare Dinamica

    109/153

    nr= 1;

    poz = n; //poz de inceput a sirului maxim

  • 7/25/2019 Java Programare Dinamica

    110/153

    lung[n] = 1; succ[n] = n+1; //stim

    for (int i=n-1;i>=1;i--){//ordine de calculsucc[i]= n+1; lung[i]=1;

    //formula de recurenta

    for(int j=i+1;j nr){nr= lung[i]; poz = i;}

    }

    nr= 1;

    poz = n; //poz de inceput a sirului maxim

  • 7/25/2019 Java Programare Dinamica

    111/153

    lung[n] = 1; succ[n] = n+1; //stim

    for (int i=n-1;i>=1;i--){//ordine de calculsucc[i]= n+1; lung[i]=1;

    //formula de recurenta

    for(int j=i+1;j nr){nr= lung[i]; poz = i;}

    }

    nr= 1;

    poz = n; //poz de inceput a sirului maxim

  • 7/25/2019 Java Programare Dinamica

    112/153

    lung[n] = 1; succ[n] = n+1; //stim

    for (int i=n-1;i>=1;i--){//ordine de calculsucc[i]= n+1; lung[i]=1;

    //formula de recurenta

    for(int j=i+1;j nr){nr= lung[i]; poz = i;}

    }

    nr= 1;

    poz = n; //poz de inceput a sirului maxim

  • 7/25/2019 Java Programare Dinamica

    113/153

    lung[n] = 1; succ[n] = n+1; //stim

    for (int i=n-1;i>=1;i--){//ordine de calculsucc[i]= n+1; lung[i]=1;

    //formula de recurenta

    for(int j=i+1;j nr){nr= lung[i]; poz = i;}

    }

    nr= 1;

    poz = n; //poz de inceput a sirului maxim

  • 7/25/2019 Java Programare Dinamica

    114/153

    lung[n] = 1; succ[n] = n+1; //stim

    for (int i=n-1;i>=1;i--){//ordine de calculsucc[i]= n+1; lung[i]=1;

    //formula de recurenta

    for(int j=i+1;j nr){nr= lung[i]; poz = i;}

    }

    nr= 1;

    poz = n; //poz de inceput a sirului maxim

  • 7/25/2019 Java Programare Dinamica

    115/153

    lung[n] = 1; succ[n] = n+1; //stim

    for (int i=n-1;i>=1;i--){//ordine de calculsucc[i]= n+1; lung[i]=1;

    //formula de recurenta

    for(int j=i+1;j nr){nr= lung[i]; poz = i;}

    }

    //afisare subsir

  • 7/25/2019 Java Programare Dinamica

    116/153

    //afisare subsir

    for (int i=1;i

  • 7/25/2019 Java Programare Dinamica

    117/153

    //a sa e subs

    for (int i=1;i

  • 7/25/2019 Java Programare Dinamica

    118/153

    //

    for (int i=1;i

  • 7/25/2019 Java Programare Dinamica

    119/153

    Principiu de optimalitate:

    Dac

    ai1, ai2, , aip,

    este un subiroptim care se termin pe poziiaip,

    atunci

    ai1, , aikeste un

    subir

    optim care

    se termin

    pe

    poziia

    ik.

    Subproblem:

    Calculmpentru fiecare poziiei lungimea maxima

    subiruluicresctorce se terminpe poziiai

    Alt soluie

  • 7/25/2019 Java Programare Dinamica

    120/153

    Principiu de optimalitate:

    Dac

    ai1, ai2, , aip,

    este un subiroptim care se termin pe poziiaip,

    atunci

    ai1, , aikeste un

    subir

    optim care

    se termin

    pe

    poziia

    ik.

    Subproblem:

    Calculmpentru fiecare poziiei lungimea maxima

    subiruluicresctorce se terminpe poziiai

    Alt soluie

  • 7/25/2019 Java Programare Dinamica

    121/153

    Principiu de optimalitate:

    Dac

    ai1, ai2, , aip,

    este un subiroptim care se termin pe poziiaip,

    atunci

    ai1, , aikeste un

    subir

    optim care

    se termin

    pe

    poziia

    ik.

    Subproblem:

    Calculmpentru fiecare poziiei lungimea maxima

    unui subircresctorce se terminpe poziiai

  • 7/25/2019 Java Programare Dinamica

    122/153

    a: 8 1 7 4 6 5 11

    lung : 2 4 2 3 2 2

    pred : 7 4 7 5 7 7

    1 2 3 4 5 6 7

  • 7/25/2019 Java Programare Dinamica

    123/153

    a: 8 1 7 4 6 5 11

    lung : 12 4 2 3 2 2

    pred : 07 4 7 5 7 7

    1 2 3 4 5 6 7

  • 7/25/2019 Java Programare Dinamica

    124/153

    a: 8 1 7 4 6 5 11

    lung : 1 14 2 3 2 2

    pred : 07 0 4 7 5 7 7

    1 2 3 4 5 6 7

  • 7/25/2019 Java Programare Dinamica

    125/153

    a: 8 1 7 4 6 5 11

    lung : 1 14 2 2 3 2 2

    pred : 07 0 2 7 5 7 7

    1 2 3 4 5 6 7

  • 7/25/2019 Java Programare Dinamica

    126/153

    a: 8 1 7 4 6 5 11

    lung : 1 14 2 223 2 2

    pred : 07 0 2 2 5 7 7

    1 2 3 4 5 6 7

  • 7/25/2019 Java Programare Dinamica

    127/153

    a: 8 1 7 4 6 5 11

    lung : 1 14 2 223 3 2 2

    pred : 07 0 2 2 4

    1 2 3 4 5 6 7

  • 7/25/2019 Java Programare Dinamica

    128/153

    a: 8 1 7 4 6 5 11

    lung : 1 14 2 223 3 2 32

    pred : 07 0 2 2 4 4

    1 2 3 4 5 6 7

  • 7/25/2019 Java Programare Dinamica

    129/153

    a: 8 1 7 4 6 5 11

    lung : 1 14 2 223 3 2 3 4

    pred : 07 0 2 2 4 4 6

    1 2 3 4 5 6 7

  • 7/25/2019 Java Programare Dinamica

    130/153

    Algoritm O n log n)- Indicaii

    1. Folosind tot programare dinamic

    Pentru fiecare lungime j=1..,n reinem

    m[j] = poziia celui mai mic element din ir cu

    proprietatea c exist un subir de lungime j care se

    termin cu el

    a[m[1]] a[m[2]] a[m[n]]

    La pasul i cutmbinar cea mai mare lungime j cu

    a[m[j]] a[i]

    Patience solitaire / patience sort

  • 7/25/2019 Java Programare Dinamica

    131/153

    prima

    carte

    Numr minim de teancuri

    https://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/LongestIncreasingSubsequence.pdf

    Patience solitaire / patience sort

    https://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/LongestIncreasingSubsequence.pdfhttps://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/LongestIncreasingSubsequence.pdfhttps://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/LongestIncreasingSubsequence.pdfhttps://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/LongestIncreasingSubsequence.pdfhttps://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/LongestIncreasingSubsequence.pdf
  • 7/25/2019 Java Programare Dinamica

    132/153

    prima

    carte

    https://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/

    LongestIncreasingSubsequence.pdf

    Numr minim de teancuri

    Patience solitaire

    https://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/LongestIncreasingSubsequence.pdfhttps://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/LongestIncreasingSubsequence.pdfhttps://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/LongestIncreasingSubsequence.pdfhttps://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/LongestIncreasingSubsequence.pdfhttps://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/LongestIncreasingSubsequence.pdf
  • 7/25/2019 Java Programare Dinamica

    133/153

    Algoritm: Greedy cartea curent este adugat la cel mai

    din stnga teanc pe care se potrivete

    - La fiecare pas, crile din topul fiecrui teanc formeaz un ir

    cresctor

    - Determinarea celui mai din stnga teanc pe care se potrivete

    cartea cu cutare binar

    - O n log n)

    Patience solitaire / patience sort

  • 7/25/2019 Java Programare Dinamica

    134/153

    6, 3, 5, 10, 12, 2, 9, 15, 14, 7, 4,8,13

    Patience solitaire / patience sort

  • 7/25/2019 Java Programare Dinamica

    135/153

    6, 3, 5, 10, 12, 2, 9, 15, 14, 7, 4,8,13

    6

    Patience solitaire / patience sort

  • 7/25/2019 Java Programare Dinamica

    136/153

    6, 3, 5, 10, 12, 2, 9, 15, 14, 7, 4,8,13

    6

    3

    Patience solitaire / patience sort

  • 7/25/2019 Java Programare Dinamica

    137/153

    6, 3, 5, 10, 12, 2, 9, 15, 14, 7, 4,8,13

    6 5

    3

    Patience solitaire / patience sort

  • 7/25/2019 Java Programare Dinamica

    138/153

    6, 3, 5, 10, 12, 2, 9, 15, 14, 7, 4,8,13

    6 5 10

    3

    Patience solitaire / patience sort

  • 7/25/2019 Java Programare Dinamica

    139/153

    6, 3, 5, 10, 12,2, 9, 15, 14, 7, 4,8,13

    6 5 10 12

    3

    Patience solitaire / patience sort

  • 7/25/2019 Java Programare Dinamica

    140/153

    6, 3, 5, 10, 12,2, 9, 15, 14, 7, 4,8,13

    6 5 10 12

    3

    2

    Patience solitaire / patience sort

  • 7/25/2019 Java Programare Dinamica

    141/153

    6, 3, 5, 10, 12,2, 9, 15, 14, 7, 4,8,13

    6 5 10 12

    3 9

    2

    Patience solitaire / patience sort

  • 7/25/2019 Java Programare Dinamica

    142/153

    6, 3, 5, 10, 12,2, 9, 15, 14, 7, 4,8,13

    6 5 10 12 15

    3 9

    2

    Patience solitaire / patience sort

  • 7/25/2019 Java Programare Dinamica

    143/153

    6, 3, 5, 10, 12,2, 9, 15, 14, 7, 4,8,13

    6 5 10 12 15

    3 9 14

    2

    Patience solitaire / patience sort

  • 7/25/2019 Java Programare Dinamica

    144/153

    6, 3, 5, 10, 12,2, 9, 15, 14, 7, 4,8,13

    6 5 10 12 15

    3 9 14

    2 7

    Patience solitaire / patience sort

  • 7/25/2019 Java Programare Dinamica

    145/153

    6, 3, 5, 10, 12,2, 9, 15, 14, 7, 4,8,13

    6 5 10 12 15

    3 4 9 14

    2 7

    Patience solitaire / patience sort

  • 7/25/2019 Java Programare Dinamica

    146/153

    6, 3, 5, 10, 12,2, 9, 15, 14, 7, 4,8,13

    6 5 10 12 15

    3 4 9 8 14

    2 7

    Patience solitaire / patience sort

  • 7/25/2019 Java Programare Dinamica

    147/153

    6, 3, 5, 10, 12,2, 9, 15, 14, 7, 4,8,13

    6 5 10 12 15

    3 4 9 8 14

    2 7 13

    Patience solitaire / patience sort

  • 7/25/2019 Java Programare Dinamica

    148/153

    Evident: numrul minim de subiruri descresctoare n

    care se poate descompune un ir lungimea maxim a unui subir cresctor

    Patience solitaire / patience sort

  • 7/25/2019 Java Programare Dinamica

    149/153

    Proprietate: numrul minim de subiruri descresctoare n

    care se poate descompune un ir =lungimea maxim a unui subir cresctor

    Patience solitaire / patience sort

  • 7/25/2019 Java Programare Dinamica

    150/153

    Proprietate: numrul minim de subiruri descresctoare n

    care se poate descompune un ir =lungimea maxim a unui subir cresctor

    Pentru a memora un subir cresctor, memorm la fiecare pas al

    algoritmului Greedy, pentru cartea curent adugat o legtur de tip

    predecesor ctre vrful teancului anterior celui n care a fost

    adugat

    Subirul cresctor se obine pornind de la ultima carte adugat i

    urmnd legtura predecesor

    Patience solitaire / patience sort

  • 7/25/2019 Java Programare Dinamica

    151/153

    prima

    carte

    https://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/LongestIncreasingSubsequence.pdf

    >:D