Numero massimo di punti che possono raggiungere due percorsi


8

Supponiamo che ci venga fornito un elenco di n punti, di cui x e yle coordinate sono tutte non negative. Supponiamo anche che non ci siano punti duplicati. Possiamo solo andare dal punto(xi,yi) indicare (xj,yj) Se xixj e yiyj. La domanda è: dati questinpunti, qual è il numero massimo di punti che possiamo raggiungere se ci è permesso disegnare due percorsi che collegano i punti usando la regola sopra? I percorsi devono iniziare dall'origine e possono contenere punti ripetuti.(0,0) ovviamente non è incluso nei punti raggiunti.

Un esempio: dato (2,0),(2,1),(1,2),(0,3),(1,3),(2,3),(3,3),(2,4),(1,5),(1,6), la risposta è 8 dal momento che possiamo prendere (0,0)(2,0)(2,1)(2,3)(2,4) e (0,0)(1,2)(1,3)(1,5)(1,6).

Se ci è permesso tracciare solo un percorso, posso facilmente risolvere la domanda programmando dinamicamente O(n2). Prima di tutto ordina i punti diminuendoxi+yi. PermettereD[i] essere il numero massimo di monete che si possono prelevare dalle monete 1 per inell'elenco ordinato. PoiD[1]=1 e D[i]=max1j<i,xjxi,yjyiD[j]+1. La risposta quindi è solo .max1inD[i]+1

Ma non riesco a trovare una relazione di ricorrenza per due percorsi. Se qualcuno ha qualche idea su una simile relazione di ricorrenza, sarei felice di sapere cosa sono.


Ordinerei lessicograficamente i punti, ma suppongo che non abbia importanza. Dovresti assolutamente ancorare in ; il percorso migliore non può usare la prima moneta. Inoltre, il modo in cui scegli il risultato suggerisce che il percorso migliore deve utilizzare l'ultimo punto. Inoltre, a causa della cattiva struttura, questo problema sembra inadatto alla DP. Trovare percorsi più lunghi nel DAG implicito dai punti avrebbe molto più senso. D[0]
Raffaello

Bene, per un percorso non è necessario includere l'ultimo punto. Se per qualche punto non ci fosse alcun punto a destra e sopra di esso, allora sarebbe semplicemente . Immagino che avrei dovuto renderlo più chiaro però. iD[i]1
Aden Dong,

Non potresti semplicemente eseguire l'algoritmo due volte, ma nel secondo passaggio rimuovere tutti i punti toccati nel primo percorso? O è richiesta una singola relazione di ricorrenza?
edA-qa mort-ora-y,

Risposte:


4

Il problema, ribadito e generalizzato: dato un set finito dotato di un ordine parziale , trova catene massimizzano . La domanda riguarda il caso in cui e .S C1,C2S|C1C2|SR+2(x,y)(z,w)xzyw

Ingenuamente, si potrebbe provare a trovare la singola catena migliore in , dove la migliore è misurata da quanti valori distinti hanno i componenti della catena. Sfortunatamente, un componente può ripercorrere i passaggi dell'altro, ad esempio, quindi questa nozione di best non ha una sottostruttura ottimale.S2

((0,0),(0,0))<((1,0),(0,0))<((2,0),(0,0))<((2,0),(1,0)),

Invece, cerchiamo le catene nell'insieme . Richiedendo che i componenti siano uguali o incomparabili, evitiamo di rintracciarli, ma ora dobbiamo sostenere che alcune migliori catene sono conformi al nuovo requisito.T:={(x,y)(x,y)S2xyyx}

Lemma 1 (nessuna traccia). Lascia che sia una catena e definisci e . Per tutti , abbiamo se e solo se .CTC1:={x(x,y)C}C2:={y(x,y)C}zSzC1C2(z,z)C

Prova. La direzione if è banale. Nel solo se direzione, per tutti , esistono tale che . Poiché è una catena, . Supponiamo simmetricamente che , che implica che . Sappiamo dalla definizione di che , quindi , e .zC1C2x,yS(x,z),(z,y)CC(x,z)(z,y)(z,y)(x,z)(x,z)(z,y)xzyTxzzyx=z=y(z,z)C

Lemma 2 (esistenza della migliore catena limitata). Per tutte le catene , esiste una catena tale che e .C1,C2SCTC1{x(x,y)C}C1C2C2{y(x,y)C}C1C2

Prova (rivista). Diamo un algoritmo per la costruzione di . Per comodità, definire sentinelle in modo tale che per tutti . Consenti a e .C,<x<xSC1:=C1{}C2:=C2{}

  1. Inizializza e e . Un invariante è che .C:=x:=y:=xyyx

  2. Sia l'elemento successivo di , ovvero . Sia l'elemento successivo di , ovvero .xC1x:=inf{zzC1x<z}yC2y:=inf{wwC2y<w}

  3. Se , imposta e vai al passaggio 9.xyyx(x,y):=(x,y)

  4. Se , imposta e vai al passaggio 9.y<x<y(x,y):=(x,x)

  5. Se , imposta e vai al passaggio 9. Nota che implica che .yx<yx:=xx<xxyxy

  6. Se , imposta e vai al passaggio 9.x<y<x(x,y):=(y,y)

  7. Se , imposta e vai al passaggio 9. Nota che implica che .xy<xy:=yy<yyxyx

  8. Questo passaggio non viene mai raggiunto, poiché le condizioni per i passaggi 3-7 sono esaustive.

  9. Se (equivalentemente, ), imposta e vai al passaggio 2.xyC:=C{(x,y)}

Programma dinamico. Per tutti , calcola dove se è vero e se è falso. Di Lemma 1, ne consegue che le espressioni parentesi contano correttamente il numero di nuovi elementi. Con Lemma 2, viene trovata la soluzione ottimale al problema originale.(x,y)T

D[x,y]:=sup({D[z,w]+[xz]+[yw][x=y]|(z,w)T(z,w)<(x,y)}{2[x=y]}),
[condition]=1condition[condition]=0condition

Bello. Non ho controllato ogni dettaglio, però. Benvenuto in cs.SE!
Raffaello

0

Consenti a di ordinare l'elenco dei punti.P=p1pn


Seguendo la tua ricorrenza per un percorso, la prima cosa da notare è che devi tenere traccia di quali punti sono stati visitati dai percorsi; altrimenti non puoi contare correttamente. La seconda cosa è che ora hai quattro possibilità per ogni punto: nessuno dei due percorsi può usarlo, uno di essi o entrambi. Quindi, dobbiamo trovare combinazioni massimizzanti per tutti e tre i casi.

Formalmente, con la coppia di (insiemi di) nodi visitati dei due percorsi che massimizzano il numero di punti visitati dall'ingresso impostato per la esima, con il primo componente della coppia massimizzazione dei percorsi per i quali il primo usa , il secondo componente simile per il secondo percorso ed il terzo componente sia percorsi usando . è dato dalla ricorrenzad:[0n](2[n]×2[n])3d(i)ipipid

d(0)=((,),(,),(,))d(i)=( argmax(L,R)(L×R)i|LR|,=( argmax(L,R)(L×R)i|LR|,=( argmax(L,R)(L×R)i|LR| )

con

(L×R)i={(L{i},R)(L,R)j=0i1d(j),ximaxjLxj,yimaxjLyj} ,

(L×R)i simile con estendentesi e simile con l'estensione sia e .R(L×R)iLR

Inutile dire che questo non è molto bello. Questo perché il problema non si presta molto bene alla programmazione dinamica: non è possibile combinare molte soluzioni parziali perché non esiste un buon ordinamento totale sui punti e non è possibile scartare risultati intermedi per lo stesso motivo.


Una visione migliore del problema è quella di modellare l'insieme di punti come grafico aciclico diretto ponderato conG=(V,E,w)

  • V={(0,0),p1,,pn,(X,Y)} con , eX=maxxiY=maxyi
  • E={((x1,y1),(x2,y2))V2xixj,yiyj} e
  • w(v1,v2)={0,v2=(X,Y)1, else .

Si noti che è possibile mantenere il grafico più piccolo se si rimuovono i bordi ridondanti, vale a dire rimuovere se esiste un percorso , poiché prendere tali "scorciatoie" non è mai meglio vantaggioso.(v1,v2)(v1,,v2)

Per un percorso, la soluzione è chiaramente la lunghezza del percorso più lungo da a . Ora, se cambiamo modo che anche tutti i bordi che portano ai punti su abbiano peso e calcoliamo il percorso più lungo in questo grafico modificato, otteniamo un percorso modo che e coprano insieme come molti punti come possono fare due percorsi. Questo ci lascia con un runtime in (vedi qui ).P(0,0)(X,Y)wP0P+PP+O(|V|+|E|)O(n2)


Potrei aver frainteso ciò che hai scritto, ma per il grafico aciclico diretto ponderato, ciò significa che possiamo semplicemente trovare prima il percorso più lungo, quindi eliminare tutti i bordi nel percorso più lungo e trovare il percorso più lungo nel grafico rimanente?
Aden Dong,

@AdenDong: No, non cancellare; al secondo percorso è consentito riutilizzare i bordi del primo percorso. Assegniamo loro il peso modo che i loro nodi target non vengano conteggiati di nuovo - vogliamo che il secondo percorso prenda una nuova rotta se redditizio, dopo tutto. 0
Raffaello
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.