Avis de non-responsabilité : la méthode décrite ci-dessous n'est pas universelle, mais elle peut souvent résoudre un problème ou vous aider à trouver la bonne solution.
Si vous avez besoin de vérifier l'existence d'une permutation dans un problème, ou de trouver le nombre de permutations qui correspondent, ou quelque chose de similaire, alors vous devriez envisager d'utiliser la programmation de sous-ensemble dynamique.
Le paramètre principal sera un masque de bits, qui montrera quels éléments ont déjà été inclus dans la permutation, et lesquels ne le sont pas. Un deuxième paramètre est également souvent requis pour indiquer quel élément a été inclus en dernier.
Souvent, les permutations peuvent être vues dans le contexte des chemins dans les graphes. En conséquence, considérons un exemple classique - le problème du chemin hamiltonien.
Un chemin hamiltonien est un chemin simple qui passe par chaque sommet du graphe exactement une fois. Il peut être représenté simplement comme une permutation de longueur n, où n est le nombre de sommets. L'ordre dans cette permutation indiquera l'ordre dans lequel les sommets de ce chemin sont traversés.
Afin de vérifier la présence d'un chemin hamiltonien dans le graphe, commençons la dynamique dp[mask][last] - existe-t-il un chemin simple qui a contourné les sommets marqués par des uns dans le masque de masque et s'est retrouvé au dernier sommet.
Les valeurs initiales seront dp[2i][i] = vrai, le reste faux, ce qui signifie qu'il y a toujours un chemin vide commençant à l'un des sommets.
Ayant la valeur true dans dp[mask][last] nous ferons des transitions vers l'avant, dans le sens de "prolonger le chemin". C'est-à-dire que nous allons chercher les nombres de sommets qui sont marqués de zéro dans le masque (nous ne les avons pas encore visités en chemin) et en même temps tels qu'il y a une arête du dernier à ce sommet (le chemin doit être prolongé par un bord existant). Autrement dit, nous faisons dp[mask | 2k][k] = vrai si dp[masque][dernier] = vrai ET masque & 2k = 0 (le sommet k n'a pas encore été visité) Et il y a une arête last -> k.
En fin de compte, un chemin hamiltonien existe s'il existe une vraie valeur dans dp pour les paramètres du masque de bits tout-un et de tout dernier sommet.