Número máximo de pontos que dois caminhos podem alcançar


8

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 xEuxjxixj e yEuyjyiyj. 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]=max1j<Eu,xjxEu,yjyEuD[j]+1D[i]=max1j<i,xjxi,yjyiD[j]+1. A resposta então é apenasmax1EunD[Eu]+1max1inD[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.


Eu classificaria os pontos lexicograficamente, mas acho que isso não importa. Você definitivamente deve ancorarD[0 0]D[0]; o melhor caminho pode não usar a primeira moeda. Além disso, a maneira como você escolhe o resultado sugere que o melhor caminho precisa usar o último ponto. Além disso, devido à estrutura desagradável, esse problema parece inadequado para a DP. Encontrar caminhos mais longos no DAG implicados pelos pontos faria muito mais sentido.
Raphael

Bem, para um caminho, o último ponto não precisa ser incluído. Se por algum pontoEui não há nenhum ponto à direita e acima dele então D[Eu]D[i] seria simplesmente 11. Acho que deveria ter deixado isso mais claro.
Aden Dong

Você não poderia simplesmente executar o algoritmo duas vezes, mas no segundo passo remover todos os pontos tocados no primeiro caminho? Ou é necessária uma única relação de recorrência?
edA-qa mort-ora-y 01/07/12

Respostas:


4

O problema, reafirmado e generalizado: dado um conjunto finito SSequipado com uma ordem parcial encontrar correntes C1,C2SC1,C2S maximizando |C1C2||C1C2|. A questão é sobre o caso em queSR2+SR2+ e (x,y)(z,W)xzyW(x,y)(z,w)xzyw.

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)),

((0,0),(0,0))<((1,0),(0,0))<((2,0),(0,0))<((2,0),(1,0)),
então essa noção de melhor não tem uma subestrutura ideal.

Em vez disso, procuramos cadeias no conjunto T: ={(x,y)(x,y)S2xyyx}T:={(x,y)(x,y)S2xyyx}. 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). DeixeiCTCT 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 todoszSzS, temos zC1C2zC1C2 se e apenas se (z,z)C(z,z)C.

Prova. A direção if é trivial. Na única direção se, para todoszC1C2zC1C2existe x,ySx,yS 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 xzyxzy. Nós sabemos pela definição deTT aquele xzzyxzzy, tão x=z=yx=z=ye (z,z)C(z,z)C.

Lema 2 (existência de melhor cadeia restrita). Para todas as cadeiasC1,C2SC1,C2S, existe uma cadeia CTCT de tal modo que C1{x(x,y)C}C1C2C1{x(x,y)C}C1C2 e C2{y(x,y)C}C1C2C2{y(x,y)C}C1C2.

Prova (revisada). Damos um algoritmo para construirCC. Por conveniência, defina sentinelas,, de tal modo que <x<<x< para todos xSxS. DeixeiC1: =C1{}C1:=C1{} e C2: =C2{}C2:=C2{}.

  1. Inicializar C: =C:= e x: =x:= e y: =y:=. Um invariante é quexyyxxyyx.

  2. Deixei xx be the next element of C1C1, that is, x:=inf{zzC1x<z}x:=inf{zzC1x<z}. Let yy be the next element of C2C2, that is, y:=inf{wwC2y<w}y:=inf{wwC2y<w}.

  3. If xyyxxyyx, set (x,y):=(x,y)(x,y):=(x,y) and go to step 9.

  4. If y<x<yy<x<y, set (x,y):=(x,x)(x,y):=(x,x) and go to step 9.

  5. If yx<yyx<y, set x:=xx:=x and go to step 9. Note that x<xxyx<xxy implies that xyxy.

  6. If x<y<xx<y<x, set (x,y):=(y,y)(x,y):=(y,y) and go to step 9.

  7. If xy<xxy<x, set y:=yy:=y and go to step 9. Note that y<yyxy<yyx implies that yxyx.

  8. This step is never reached, as the conditions for steps 3–7 are exhaustive.

  9. If xx (equivalently, yy), 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]+[xz]+[yw][x=y]|(z,w)T(z,w)<(x,y)}{2[x=y]}),

D[x,y]:=sup({D[z,w]+[xz]+[yw][x=y](z,w)T(z,w)<(x,y)}{2[x=y]}),
where [condition]=1[condition]=1 if conditioncondition is true and [condition]=0[condition]=0 if conditioncondition is false. By Lemma 1, it follows that the bracket expressions correctly count the number of new elements. By Lemma 2, the optimal solution to the original problem is found.

Nice. I have not checked every detail, though. Welcome to cs.SE!
Raphael

0

Let P=p1pnP=p1pn 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:[0n](2[n]×2[n])3d:[0n](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 iith 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|LR|,=( argmax(L,R)(L×R)i|LR|,=( argmax(L,R)(L×R)i|LR| )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| )

with

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

(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

  • V={(0,0),p1,,pn,(X,Y)}V={(0,0),p1,,pn,(X,Y)} with X=maxxiX=maxxi, Y=maxyiY=maxyi, and
  • E={((x1,y1),(x2,y2))V2xixj,yiyj}E={((x1,y1),(x2,y2))V2xixj,yiyj} and
  • w(v1,v2)={0,v2=(X,Y)1, elsew(v1,v2)={01,v2=(X,Y), else.

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 PP 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).


I may have misunderstood what you wrote, but for the weighted directed acyclic graph, does that mean we can simply find the longest path first, then delete all the edges in the longest path and find the longest path in the remaining graph?
Aden Dong

@AdenDong: No, not delete; the second path is allowed to reuse edges the first path took. We assign them weight 0 so their target nodes are not counted again -- we want the second path to take a new route if profitable, after all.
Raphael
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.