Supposons que l'on nous donne une liste de points, dont les coordonnées et sont toutes non négatives. Supposons également qu'il n'y ait pas de points en double. On ne peut aller du point au point si et . La question est: étant donné ces points, quel est le nombre maximum de points que nous pouvons atteindre si nous sommes autorisés à tracer deux chemins qui relient des points en utilisant la règle ci-dessus? Les chemins doivent partir de l'origine et peuvent contenir des points répétés. n'est bien sûr pas inclus dans les points atteints.
Un exemple: donné , la réponse est puisque nous pouvons prendre et .
Si nous sommes autorisés à dessiner un seul chemin, je peux facilement résoudre la question par une programmation dynamique qui s'exécute en . Je trie d'abord les points en diminuant . Soit le nombre maximum de pièces que l'on peut ramasser des pièces à dans la liste triée. Alors et . La réponse est alors simplement .
Mais je ne peux pas trouver une relation de récurrence pour deux chemins. Si quelqu'un a une idée d'une telle relation de récurrence, je serais heureux d'entendre ce qu'ils sont.
Réponses:
Le problème, reformulé et généralisé: étant donné un ensemble fini équipé d'un ordre partiel , trouver les chaînes maximisant . La question concerne le cas où et .S ≤ C1,C2⊆S |C1∪C2| S⊆R2+ (x,y)≤(z,w)⟺x≤z∧y≤w
Naïvement, on pourrait essayer de trouver la meilleure chaîne unique dans , où la meilleure est mesurée par le nombre de valeurs distinctes des composants de la chaîne. Malheureusement, un composant peut retracer les étapes de l'autre, par exemple, donc cette notion de meilleur n'a pas de sous-structure optimale.S2
Au lieu de cela, nous recherchons des chaînes dans l'ensemble . En exigeant que les composants soient égaux ou incomparables, nous empêchons le retracement mais devons maintenant affirmer que la meilleure chaîne est conforme à la nouvelle exigence.T:={(x,y)∣(x,y)∈S2∧x≮y∧y≮x}
Lemme 1 (pas de retracement). Soit une chaîne et définissez et . Pour tout , nous avons si et seulement si .C⊆T C1:={x∣(x,y)∈C} C2:={y∣(x,y)∈C} z∈S z∈C1∩C2 (z,z)∈C
Preuve. La direction if est triviale. Dans la direction seulement si, pour tout , il existe de telle sorte que . Puisque est une chaîne, . Supposons symétriquement que , ce qui implique que . On sait par la définition de que , de sorte , et .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
Lemme 2 (existence de la meilleure chaîne restreinte). Pour toutes les chaînes , il existe une chaîne telle que and .C1,C2⊆S C⊆T C1⊆{x∣(x,y)∈C}⊆C1∪C2 C2⊆{y∣(x,y)∈C}⊆C1∪C2
Preuve (révisée). Nous donnons un algorithme pour construire . Pour plus de commodité, définir factionnaires tel que pour tous . Soit et .C ⊥,⊤ ⊥<x<⊤ x∈S C′1:=C1∪{⊤} C′2:=C2∪{⊤}
Initialisez et et . Un invariant est que .C:=∅ x:=⊥ y:=⊥ x≮y∧y≮x
Soit le prochain élément de , c'est-à-dire . Soit l'élément suivant de , c'est-à-dire .x′ C1 x′:=inf{z∣z∈C′1∧x<z} y′ C2 y′:=inf{w∣w∈C′2∧y<w}
Si , définissez et passez à l'étape 9.x′≮y′∧y′≮x′ (x,y):=(x′,y′)
Si , définissez et passez à l'étape 9.y<x′<y′ (x,y):=(x′,x′)
Si , définissez et passez à l'étape 9. Notez que implique que .y≮x′<y′ x:=x′ x<x′∧x≮y x′≮y
Si , définissez et passez à l'étape 9.x<y′<x′ (x,y):=(y′,y′)
Si , définissez et passez à l'étape 9. Notez que implique que .x≮y′<x′ y:=y′ y<y′∧y≮x y′≮x
Cette étape n'est jamais atteinte, car les conditions des étapes 3 à 7 sont exhaustives.
Si (de manière équivalente, ), définissez et passez à l'étape 2.x≠⊤ y≠⊤ C:=C∪{(x,y)}
Programme dynamique. Pour tout , calculez où si est vrai et si est faux. Par le lemme 1, il s'ensuit que les expressions entre crochets comptent correctement le nombre de nouveaux éléments. Par le lemme 2, la solution optimale au problème d'origine est trouvée.(x,y)∈T
la source
Soit pour une liste triée de points.P=p1…pn
Après votre récurrence pour un chemin, la première chose à noter est que vous devez garder une trace des points qui ont été visités par les chemins; sinon vous ne pourrez pas compter correctement. La deuxième chose est que vous avez maintenant quatre possibilités pour chaque point: aucun chemin ne peut l'utiliser, l'un d'eux ou les deux. Nous devons donc trouver des combinaisons maximales pour les trois cas.
Formellement, soit avec la paire de (ensembles de) nœuds visités des deux chemins qui maximisent le nombre de points visités de la configuration d'entrée au ème, avec le premier composant la paire de chemins maximisante pour laquelle le premier utilise , le deuxième composant similaire pour le deuxième chemin et le troisième composant avec les deux chemins utilisant . est donné par la récurrenced:[0…n]→(2[n]×2[n])3 d(i) i pi pi d
avec
Inutile de dire que ce n'est pas très agréable. En effet, le problème ne se prête pas très bien à la programmation dynamique: vous ne pouvez pas combiner de nombreuses solutions partielles car il n'y a pas de bon classement total sur les points, et vous ne pouvez pas ignorer les résultats intermédiaires pour la même raison.
Une meilleure vue du problème consiste à modéliser l'ensemble des points sous forme de graphique acyclique dirigé pondéré avecG=(V,E,w)
Notez que vous pouvez garder le graphique plus petit si vous supprimez des bords redondants, c'est-à-dire supprimer s'il y a un chemin , car prendre de tels "raccourcis" n'est jamais plus avantageux.(v1,v2) (v1,…,v2)
Pour un chemin, la solution est clairement la longueur du plus long chemin de à . Maintenant, si nous modifions sorte que toutes les arêtes menant aux points sur aient également le poids et calculent le chemin le plus long dans ce graphique modifié, nous obtenons un chemin sorte que et couvrent ensemble comme autant de points que deux chemins peuvent. Cela nous laisse avec un runtime dans (voir ici ).P∗ (0,0) (X,Y) w P∗ 0 P+ P∗ P+ O(|V|+|E|)⊆O(n2)
la source