Número máximo de puntos que pueden alcanzar dos caminos

8

Supongamos que se nos da una lista de puntos, cuyos e Las coordenadas son todos los no-negativo. Supongamos también que no hay puntos duplicados. Solo podemos ir del punto al punto si y . La pregunta es: dados estos puntos, ¿cuál es el número máximo de puntos que podemos alcanzar si se nos permite dibujar dos caminos que conectan puntos usando la regla anterior? Las rutas deben comenzar desde el origen y pueden contener puntos repetidos. por supuesto no está incluido en los puntos alcanzados.nxy(xi,yi)(xj,yj)xixjyiyjn(0,0)

Un ejemplo: dado , la respuesta es ya que podemos tomar y .(2,0),(2,1),(1,2),(0,3),(1,3),(2,3),(3,3),(2,4),(1,5),(1,6)8(0,0)(2,0)(2,1)(2,3)(2,4)(0,0)(1,2)(1,3)(1,5)(1,6)

Si se nos permite dibujar solo una ruta, puedo resolver fácilmente la pregunta mediante la programación dinámica que se ejecuta en . Primero los puntos disminuyendo . Sea el número máximo de monedas que se pueden recoger de las monedas a en la lista ordenada. Entonces y . La respuesta es simplemente \ max \ limits_ {1 \ le i \ le n} D [i] + 1 .O(n2)xi+yiD[i]1iD[1]=1D[i]=max1j<i,xjxi,yjyiD[j]+1max1inD[i]+1

Pero no puedo encontrar una relación de recurrencia para dos caminos. Si alguien tiene alguna idea sobre una relación de recurrencia, me encantaría saber cuáles son.

Aden Dong
fuente
Ordenaría los puntos lexicográficamente, pero supongo que no importa. Definitivamente deberías anclar en ; el mejor camino puede no usar la primera moneda. Además, la forma en que elige el resultado sugiere que la mejor ruta tiene que usar el último punto. Además, debido a la estructura desagradable, este problema parece no ser adecuado para DP. Encontrar caminos más largos en el DAG implicados por los puntos tendría mucho más sentido. D[0]
Raphael
Bueno, para un camino, el último punto no necesita ser incluido. Si para algún punto no hay ningún punto a la derecha y arriba de él, entonces sería simplemente . Aunque creo que debería haberlo dejado más claro. iD[i]1
Aden Dong
¿No podría simplemente ejecutar el algoritmo dos veces, sino que en la segunda pasada eliminar todos los puntos tocados en la primera ruta? ¿O se requiere una relación de recurrencia única?
edA-qa mort-ora-y

Respuestas:

4

El problema, reformulado y generalizado: dado un conjunto finito equipado con un orden parcial , encuentre las cadenas maximizando . La pregunta es sobre el caso donde y .S C1,C2S|C1C2|SR+2(x,y)(z,w)xzyw

Ingenuamente, uno podría tratar de encontrar la mejor cadena individual en , donde la mejor se mide por cuántos valores distintos tienen los componentes de la cadena. Desafortunadamente, un componente puede volver sobre los pasos del otro, por ejemplo, por lo que esta noción de mejor no tiene una subestructura óptima.S2

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

En cambio, buscamos cadenas en el conjunto . Al exigir que los componentes sean iguales o incomparables, evitamos el retroceso, pero ahora debemos argumentar que la mejor cadena se ajusta al nuevo requisito.T:={(x,y)(x,y)S2xyyx}

Lema 1 (sin retroceso). Deje que sea ​​una cadena y defina y . Para todos , tenemos si y sólo si .CTC1:={x(x,y)C}C2:={y(x,y)C}zSzC1C2(z,z)C

Prueba. La dirección if es trivial. En el único caso de dirección, para todos , existen tal que . Como es una cadena, . Suponga simétricamente que , lo que implica que . Sabemos por la definición de que , por lo que , y .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

Lema 2 (existencia de la mejor cadena restringida). Para todas las cadenas , existe una cadena tal que y .C1,C2SCTC1{x(x,y)C}C1C2C2{y(x,y)C}C1C2

Prueba (revisada). Damos un algoritmo para construir . Por conveniencia, definir centinelas de tal manera que para todos . Deje y .C,<x<xSC1:=C1{}C2:=C2{}

  1. Inicialice y e . Una invariante es que .C:=x:=y:=xyyx

  2. Dejemos que sea ​​el siguiente elemento de , es decir, . Sea el siguiente elemento de , es decir, .xC1x:=inf{zzC1x<z}yC2y:=inf{wwC2y<w}

  3. Si , establezca y vaya al paso 9.xyyx(x,y):=(x,y)

  4. Si , establezca y vaya al paso 9.y<x<y(x,y):=(x,x)

  5. Si , establezca y vaya al paso 9. Tenga en cuenta que implica que .yx<yx:=xx<xxyxy

  6. Si , establezca y vaya al paso 9.x<y<x(x,y):=(y,y)

  7. Si , establezca y vaya al paso 9. Tenga en cuenta que implica que .xy<xy:=yy<yyxyx

  8. Este paso nunca se alcanza, ya que las condiciones para los pasos 3–7 son exhaustivas.

  9. Si (equivalentemente, ), configure y vaya al paso 2.xyC:=C{(x,y)}

Programa Dinámico. Para todos , calcule donde si es verdadero y si es falso. Por el Lema 1, se deduce que las expresiones de paréntesis cuentan correctamente el número de elementos nuevos. En Lemma 2, se encuentra la solución óptima para el problema original.(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
Herm
fuente
Agradable. Sin embargo, no he verificado todos los detalles. Bienvenido a cs.SE!
Raphael
0

Deje para ordenar la lista de puntos.P=p1pn


Después de su recurrencia para una ruta, lo primero que debe tener en cuenta es que debe realizar un seguimiento de los puntos que han sido visitados por las rutas; de lo contrario no puede contar correctamente. Lo segundo es que ahora tiene cuatro posibilidades para cada punto: ninguna ruta puede usarlo, una de ellas o ambas. Entonces, tenemos que encontrar combinaciones de maximización para los tres casos.

Formalmente, deje con el par de (conjuntos de) nodos visitados de los dos rutas que maximizan el número de puntos visitados desde la entrada configurada hasta la ésima, con el primer componente el par maximizador de rutas para las cuales la primera usa , el segundo componente es similar para la segunda ruta y el tercer componente con ambos caminos usando . viene dada por la recurrenciad:[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 similar con extiende y similar con extiende tanto y .R(L×R)iLR

No hace falta decir que esto no es muy agradable. Esto se debe a que el problema no se presta muy bien a la programación dinámica: no se pueden combinar muchas soluciones parciales porque no hay un ordenamiento total agradable en los puntos, y no se pueden descartar resultados intermedios por la misma razón.


Una mejor visión del problema es modelar el conjunto de puntos como un gráfico acíclico dirigido ponderado conG=(V,E,w)

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

Tenga en cuenta que puede mantener el gráfico más pequeño si elimina bordes redundantes, es decir, eliminar si hay una ruta , porque tomar tales "atajos" nunca es mejor.(v1,v2)(v1,,v2)

Para una ruta, la solución es claramente la longitud de la ruta más larga desde hasta . Ahora, si cambiamos para que todos los bordes que conducen a puntos en también tengan peso y calculemos la ruta más larga en este gráfico modificado, obtenemos una ruta para que y juntos cubran como muchos puntos como pueden dos caminos. Esto nos deja con un tiempo de ejecución en (ver aquí ).P(0,0)(X,Y)wP0P+PP+O(|V|+|E|)O(n2)

Rafael
fuente
Puede que haya entendido mal lo que escribió, pero para el gráfico acíclico dirigido ponderado, ¿eso significa que simplemente podemos encontrar primero la ruta más larga, luego eliminar todos los bordes en la ruta más larga y encontrar la ruta más larga en el gráfico restante?
Aden Dong
@AdenDong: No, no eliminar; la segunda ruta puede reutilizar los bordes que tomó la primera ruta. Les asignamos un peso para que sus nodos objetivo no se vuelvan a contar ; después de todo , queremos que la segunda ruta tome una nueva ruta si es rentable. 0
Raphael