Nombre maximum de points que deux chemins peuvent atteindre


8

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.nxy(xi,yi)(xj,yj)xixjyiyjn(0,0)

Un exemple: donné (2,0),(2,1),(1,2),(0,3),(1,3),(2,3),(3,3),(2,4),(1,5),(1,6) , la réponse est 8 puisque nous pouvons prendre (0,0)(2,0)(2,1)(2,3)(2,4) et (0,0)(1,2)(1,3)(1,5)(1,6) .

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 O(n2) . Je trie d'abord les points en diminuant xi+yi . Soit D[i] le nombre maximum de pièces que l'on peut ramasser des pièces 1 à i dans la liste triée. Alors D[1]=1 et D[i]=max1j<i,xjxi,yjyiD[j]+1 . La réponse est alors simplement max1inD[i]+1 .

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.


Je trierais les points lexicographiquement, mais je suppose que cela n'a pas d'importance. Vous devez certainement ancrer dans ; le meilleur chemin ne peut pas utiliser la première pièce. De plus, la façon dont vous choisissez le résultat suggère que le meilleur chemin doit utiliser le dernier point. De plus, en raison de la structure désagréable, ce problème semble mal adapté au DP. Trouver les plus longs chemins dans le DAG impliqué par les points aurait beaucoup plus de sens. D[0]
Raphael

Eh bien, pour un chemin, le dernier point n'a pas besoin d'être inclus. Si pour un certain point il n'y a pas de point à droite et au-dessus, alors serait simplement . Je suppose que j'aurais dû le préciser plus clairement. iD[i]1
Aden Dong

Ne pourriez-vous pas simplement exécuter l'algorithme deux fois, mais dans la deuxième passe, supprimer tous les points touchés dans le premier chemin? Ou une seule relation de récurrence est-elle requise?
edA-qa mort-ora-y

Réponses:


4

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,C2S|C1C2|SR+2(x,y)(z,w)xzyw

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

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

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)S2xyyx}

Lemme 1 (pas de retracement). Soit une chaîne et définissez et . Pour tout , nous avons si et seulement si .CTC1:={x(x,y)C}C2:={y(x,y)C}zSzC1C2(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 .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

Lemme 2 (existence de la meilleure chaîne restreinte). Pour toutes les chaînes , il existe une chaîne telle que and .C1,C2SCTC1{x(x,y)C}C1C2C2{y(x,y)C}C1C2

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<xSC1:=C1{}C2:=C2{}

  1. Initialisez et et . Un invariant est que .C:=x:=y:=xyyx

  2. Soit le prochain élément de , c'est-à-dire . Soit l'élément suivant de , c'est-à-dire .xC1x:=inf{zzC1x<z}yC2y:=inf{wwC2y<w}

  3. Si , définissez et passez à l'étape 9.xyyx(x,y):=(x,y)

  4. Si , définissez et passez à l'étape 9.y<x<y(x,y):=(x,x)

  5. Si , définissez et passez à l'étape 9. Notez que implique que .yx<yx:=xx<xxyxy

  6. Si , définissez et passez à l'étape 9.x<y<x(x,y):=(y,y)

  7. Si , définissez et passez à l'étape 9. Notez que implique que .xy<xy:=yy<yyxyx

  8. Cette étape n'est jamais atteinte, car les conditions des étapes 3 à 7 sont exhaustives.

  9. Si (de manière équivalente, ), définissez et passez à l'étape 2.xyC:=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

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

Agréable. Je n'ai cependant pas vérifié tous les détails. Bienvenue sur cs.SE!
Raphael

0

Soit pour une liste triée de points.P=p1pn


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:[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| )

avec

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

(L×R)i similaire à l' extension et similaire à l' extension à la fois et .R(L×R)iLR

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)

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

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)wP0P+PP+O(|V|+|E|)O(n2)


J'ai peut-être mal compris ce que vous avez écrit, mais pour le graphique acyclique pondéré, cela signifie-t-il que nous pouvons simplement trouver le chemin le plus long en premier, puis supprimer toutes les arêtes du chemin le plus long et trouver le chemin le plus long dans le graphique restant?
Aden Dong

@AdenDong: Non, pas supprimer; le deuxième chemin est autorisé à réutiliser les bords du premier chemin. Nous leur attribuons le poids afin que leurs nœuds cibles ne soient pas comptés à nouveau - nous voulons que le deuxième chemin prenne un nouvel itinéraire s'il est rentable, après tout. 0
Raphael
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.