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.
Un ejemplo: dado , la respuesta es ya que podemos tomar y .
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 .
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.
Respuestas:
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,C2⊆S |C1∪C2| S⊆R2+ (x,y)≤(z,w)⟺x≤z∧y≤w
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
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)∈S2∧x≮y∧y≮x}
Lema 1 (sin retroceso). Deje que sea una cadena y defina y . Para todos , tenemos si y sólo si .C⊆T C1:={x∣(x,y)∈C} C2:={y∣(x,y)∈C} z∈S z∈C1∩C2 (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 .z∈C1∩C2 x,y∈S (x,z),(z,y)∈C C (x,z)≤(z,y)∨(z,y)≤(x,z) (x,z)≤(z,y) x≤z≤y T x≮z∧z≮y x=z=y (z,z)∈C
Lema 2 (existencia de la mejor cadena restringida). Para todas las cadenas , existe una cadena tal que y .C1,C2⊆S C⊆T C1⊆{x∣(x,y)∈C}⊆C1∪C2 C2⊆{y∣(x,y)∈C}⊆C1∪C2
Prueba (revisada). Damos un algoritmo para construir . Por conveniencia, definir centinelas de tal manera que para todos . Deje y .C ⊥,⊤ ⊥<x<⊤ x∈S C′1:=C1∪{⊤} C′2:=C2∪{⊤}
Inicialice y e . Una invariante es que .C:=∅ x:=⊥ y:=⊥ x≮y∧y≮x
Dejemos que sea el siguiente elemento de , es decir, . Sea el siguiente elemento de , es decir, .x′ C1 x′:=inf{z∣z∈C′1∧x<z} y′ C2 y′:=inf{w∣w∈C′2∧y<w}
Si , establezca y vaya al paso 9.x′≮y′∧y′≮x′ (x,y):=(x′,y′)
Si , establezca y vaya al paso 9.y<x′<y′ (x,y):=(x′,x′)
Si , establezca y vaya al paso 9. Tenga en cuenta que implica que .y≮x′<y′ x:=x′ x<x′∧x≮y x′≮y
Si , establezca y vaya al paso 9.x<y′<x′ (x,y):=(y′,y′)
Si , establezca y vaya al paso 9. Tenga en cuenta que implica que .x≮y′<x′ y:=y′ y<y′∧y≮x y′≮x
Este paso nunca se alcanza, ya que las condiciones para los pasos 3–7 son exhaustivas.
Si (equivalentemente, ), configure y vaya al paso 2.x≠⊤ y≠⊤ C:=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
fuente
Deje para ordenar la lista de puntos.P=p1…pn
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:[0…n]→(2[n]×2[n])3 d(i) i pi pi d
con
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)
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) w P∗ 0 P+ P∗ P+ O(|V|+|E|)⊆O(n2)
fuente