Suponha que recebamos uma lista de nn pontos, cujos xx e yycoordenadas são todas não-negativas. Suponha também que não haja pontos duplicados. Só podemos ir do ponto(xEu,yEu)(xi,yi) apontar (xj,yj)(xj,yj) E se xEu≤xjxi≤xj e yEu≤yjyi≤yj. A questão é: dadas essasnnpontos, qual é o número máximo de pontos que podemos alcançar se pudermos desenhar dois caminhos que conectam pontos usando a regra acima? Os caminhos devem começar a partir da origem e podem conter pontos repetidos.(0 0,0 0)(0,0) é claro que não está incluído nos pontos alcançados.
Um exemplo: dado (2,0 0),(2,1),(1,2),(0 0,3),(1,3),(2,3),(3,3),(2,4),(1,5),(1,6)(2,0),(2,1),(1,2),(0,3),(1,3),(2,3),(3,3),(2,4),(1,5),(1,6), a resposta é 88 já que podemos pegar (0 0,0 0)→(2,0 0)→(2,1)→(2,3)→(2,4)(0,0)→(2,0)→(2,1)→(2,3)→(2,4) e (0 0,0 0)→(1,2)→(1,3)→(1,5)→(1,6)(0,0)→(1,2)→(1,3)→(1,5)→(1,6).
Se pudermos desenhar apenas um caminho, eu posso resolver facilmente a questão pela programação dinâmica executada em O(n2)O(n2). Eu primeiro classifico os pontos diminuindoxEu+yEuxi+yi. DeixeiD[Eu]D[i] ser o número máximo de moedas que se pode pegar em moedas 11 para Euina lista classificada. EntãoD[1]=1D[1]=1 e D[Eu]=max1≤j<Eu,xj≤xEu,yj≤yEuD[j]+1D[i]=max1≤j<i,xj≤xi,yj≤yiD[j]+1. A resposta então é apenasmax1≤Eu≤nD[Eu]+1max1≤i≤nD[i]+1.
Mas não consigo criar uma relação de recorrência para dois caminhos. Se alguém tiver alguma idéia sobre essa relação de recorrência, ficaria feliz em saber o que são.
Respostas:
O problema, reafirmado e generalizado: dado um conjunto finito SS equipado com uma ordem parcial ≤≤ encontrar correntes C1,C2⊆SC1,C2⊆S maximizando |C1∪C2||C1∪C2| . A questão é sobre o caso em queS⊆R2+S⊆R2+ e (x,y)≤(z,W)⟺x≤z∧y≤W(x,y)≤(z,w)⟺x≤z∧y≤w .
Ingenuamente, pode-se tentar encontrar a melhor cadeia em S2S2 , onde melhor é medido por quantos valores distintos os componentes da cadeia possuem. Infelizmente, um componente pode refazer as etapas do outro, por exemplo,((0 0,0 0),(0 0,0 0))<((1,0 0),(0 0,0 0))<((2,0 0),(0 0,0 0))<((2,0 0),(1,0 0)),
Em vez disso, procuramos cadeias no conjunto T: ={(x,y)∣(x,y)∈S2∧x≮y∧y≮x}T:={(x,y)∣(x,y)∈S2∧x≮y∧y≮x} . Ao exigir que os componentes sejam iguais ou incomparáveis, evitamos retroceder, mas agora precisamos argumentar que alguma melhor cadeia está em conformidade com o novo requisito.
Lema 1 (sem refazer). DeixeiC⊆TC⊆T ser uma cadeia e definir C1: ={x∣(x,y)∈C}C1:={x∣(x,y)∈C} e C2: ={y∣(x,y)∈C}C2:={y∣(x,y)∈C} . Para todosz∈Sz∈S , temos z∈C1∩C2z∈C1∩C2 se e apenas se (z,z)∈C(z,z)∈C .
Prova. A direção if é trivial. Na única direção se, para todosz∈C1∩C2z∈C1∩C2 existe x,y∈Sx,y∈S de tal modo que (x,z),(z,y)∈C(x,z),(z,y)∈C . Desde aCC é uma corrente (x,z)≤(z,y)∨(z,y)≤(x,z)(x,z)≤(z,y)∨(z,y)≤(x,z) . Suponha simetricamente que(x,z)≤(z,y)(x,z)≤(z,y) , o que implica que x≤z≤yx≤z≤y . Nós sabemos pela definição deTT aquele x≮z∧z≮yx≮z∧z≮y , tão x=z=yx=z=y e (z,z)∈C(z,z)∈C .
Lema 2 (existência de melhor cadeia restrita). Para todas as cadeiasC1,C2⊆SC1,C2⊆S , existe uma cadeia C⊆TC⊆T de tal modo que C1⊆{x∣(x,y)∈C}⊆C1∪C2C1⊆{x∣(x,y)∈C}⊆C1∪C2 e C2⊆{y∣(x,y)∈C}⊆C1∪C2C2⊆{y∣(x,y)∈C}⊆C1∪C2 .
Prova (revisada). Damos um algoritmo para construirCC . Por conveniência, defina sentinelas⊥,⊤⊥,⊤ de tal modo que ⊥<x<⊤⊥<x<⊤ para todos x∈Sx∈S . DeixeiC′1: =C1∪{⊤}C′1:=C1∪{⊤} e C′2: =C2∪{⊤}C′2:=C2∪{⊤} .
Inicializar C: =∅C:=∅ e x: =⊥x:=⊥ e y: =⊥y:=⊥ . Um invariante é quex≮y∧y≮xx≮y∧y≮x .
Deixei x′x′ be the next element of C1C1 , that is, x′:=inf{z∣z∈C′1∧x<z}x′:=inf{z∣z∈C′1∧x<z} . Let y′y′ be the next element of C2C2 , that is, y′:=inf{w∣w∈C′2∧y<w}y′:=inf{w∣w∈C′2∧y<w} .
If x′≮y′∧y′≮x′x′≮y′∧y′≮x′ , set (x,y):=(x′,y′)(x,y):=(x′,y′) and go to step 9.
If y<x′<y′y<x′<y′ , set (x,y):=(x′,x′)(x,y):=(x′,x′) and go to step 9.
If y≮x′<y′y≮x′<y′ , set x:=x′x:=x′ and go to step 9. Note that x<x′∧x≮yx<x′∧x≮y implies that x′≮yx′≮y .
If x<y′<x′x<y′<x′ , set (x,y):=(y′,y′)(x,y):=(y′,y′) and go to step 9.
If x≮y′<x′x≮y′<x′ , set y:=y′y:=y′ and go to step 9. Note that y<y′∧y≮xy<y′∧y≮x implies that y′≮xy′≮x .
This step is never reached, as the conditions for steps 3–7 are exhaustive.
If x≠⊤x≠⊤ (equivalently, y≠⊤y≠⊤ ), set C:=C∪{(x,y)}C:=C∪{(x,y)} and go to step 2.
Dynamic Program. For all (x,y)∈T(x,y)∈T , compute D[x,y]:=sup({D[z,w]+[x≠z]+[y≠w]−[x=y]|(z,w)∈T∧(z,w)<(x,y)}∪{2−[x=y]}),
fonte
Let P=p1…pnP=p1…pn to sorted list of points.
Following your recurrence for one path, the first thing to note is that you have to keep track of which points have been visited by the paths; otherwise you can not count correctly. The second thing is that you have now four possibilities for every point: neither path may use it, one of them or both. So, we have to find maximising combinations for all three cases.
Formally, let d:[0…n]→(2[n]×2[n])3d:[0…n]→(2[n]×2[n])3 with d(i)d(i) the pair of (sets of) visited nodes of the two paths that maximise the number of visited points from the input set up to the ii th one, with the first component the maximising pair of paths for which the first one uses pipi , the second component similar for the second path and the third component with both paths using pipi . dd is given by the recurrence
d(0)=((∅,∅),(∅,∅),(∅,∅))d(i)=( argmax(L,R)∈(L′×R)i|L∪R|,=( argmax(L,R)∈(L×R′)i|L∪R|,=( argmax(L,R)∈(L′×R′)i|L∪R| )d(0)d(i)=((∅,∅),(∅,∅),(∅,∅))=( argmax(L,R)∈(L′×R)i|L∪R|,=( argmax(L,R)∈(L×R′)i|L∪R|,=( argmax(L,R)∈(L′×R′)i|L∪R| )
with
(L′×R)i={(L∪{i},R)∣(L,R)∈i−1⋃j=0d(j),xi≥maxj∈Lxj,yi≥maxj∈Lyj}(L′×R)i={(L∪{i},R)∣(L,R)∈⋃j=0i−1d(j),xi≥maxj∈Lxj,yi≥maxj∈Lyj} ,
(L′×R)i(L′×R)i similar with extending RR and (L′×R′)i(L′×R′)i similar with extending both LL and RR .
Needless to say, this is not very nice. This is because the problem does not lend itself to dynamic programming very well: you can not combine many partial solutions because there is no nice total ordering on the points, and you can not discard intermediate results for the same reason.
A nicer view on the problem is to model the set of points as weighted directed acyclic graph G=(V,E,w)G=(V,E,w) with
Note that you can keep the graph smaller if you remove redundant edges, that is remove (v1,v2)(v1,v2) if there is a path (v1,…,v2)(v1,…,v2) , because taking such "shortcuts" is never better advantageous.
For one path, the solution is clearly the length of the longest path P∗P∗ from (0,0)(0,0) to (X,Y)(X,Y) . Now, if we change w so that all edges leading to points on P∗ also have weight 0 and compute the longest path in this modified graph, we get a path P+ so that P∗ and P+ together cover as many points as two paths can. This leaves us with a runtime in O(|V|+|E|)⊆O(n2) (see here).
fonte