C'est un problème de comptage, pas un problème de construction, de sorte que nous pouvons nous approcher en utilisant la récursivité. Depuis le problème a deux parties, à la recherche de la gauche et de la recherche à partir de la droite, de le diviser et de le résoudre pour une première partie.
Laissez - b(N, L, R)
le nombre de solutions, et laissez - f(N, L)
le nombre d'arrangements de N
blocs de sorte qu' L
sont visibles à partir de la gauche. D'abord pensez - f
parce que c'est plus facile.
APPROCHE 1
Commençons par les conditions initiales et puis aller pour la récursivité. Si tout le monde doit être visible, ils doivent être commandés de plus en plus, de sorte
f(N, N) = 1
Si il y a supposer pour être plus visible blocs de blocs disponibles, alors nous ne pouvons rien faire, donc
f(N, M) = 0 if N < M
Si seulement un pâté de maisons devraient être visibles, puis de les mettre le plus en premier, puis les autres peuvent suivre dans n'importe quel ordre, afin de
f(N,1) = (N-1)!
Enfin, pour la récursivité, pensez à la position de la plus haute bloc, dire N
est le k
ème place à partir de la gauche. Ensuite, choisissez les blocs à venir avant elle, en (N-1 choose k-1)
façons, organiser les blocs de sorte que exactement L-1
sont visibles à partir de la gauche, et de l'ordre de l' N-k
blocs derrière N
dans tout ce que vous souhaitez, donner:
f(N, L) = sum_{1<=k<=N} (N-1 choose k-1) * f(k-1, L-1) * (N-k)!
En fait, depuis f(x-1,L-1) = 0
pour x<L
, on peut aussi bien le début k
à L
au lieu de 1
:
f(N, L) = sum_{L<=k<=N} (N-1 choose k-1) * f(k-1, L-1) * (N-k)!
Bon, alors maintenant que le plus facile est peu compris, nous allons utiliser f
à régler pour le plus difficile bits b
. Encore une fois, utiliser la récursivité en fonction de la position de la plus haute bloc, encore une fois dire N
est en position k
à partir de la gauche. Comme avant, choisir les blocs avant de en N-1 choose k-1
façons, mais maintenant, pensez à chaque côté de ce bloc séparément. Pour l' k-1
blocs de gauche de N
, assurez-vous que L-1
d'entre eux sont visibles. Pour l' N-k
blocs de droit de l' N
, assurez-vous que R-1
sont visibles et ensuite inverser l'ordre de f
. Donc la réponse est:
b(N,L,R) = sum_{1<=k<=N} (N-1 choose k-1) * f(k-1, L-1) * f(N-k, R-1)
où f
est entièrement travaillé ci-dessus. Encore une fois, de nombreux termes sera de zéro, de sorte que nous ne voulons prendre en k
tels que k-1 >= L-1
et N-k >= R-1
pour obtenir
b(N,L,R) = sum_{L <= k <= N-R+1} (N-1 choose k-1) * f(k-1, L-1) * f(N-k, R-1)
APPROCHE 2
J'ai pensé à ce problème et a trouvé un peu plus agréable qui évite la sommation.
Si vous travaillez le problème le chemin inverse, c'est penser à ajouter le plus petit bloc au lieu de la plus grande à bloc, puis la récurrence pour f
devient beaucoup plus simple. Dans ce cas, avec les mêmes conditions initiales, de la récurrence
f(N,L) = f(N-1,L-1) + (N-1) * f(N-1,L)
où le premier terme, f(N-1,L-1)
, vient de placer le plus petit bloc dans la position la plus à gauche, ce qui ajoute un plus visibles bloc (d'où l' L
diminue d' L-1
), et le deuxième terme, (N-1) * f(N-1,L)
, les comptes pour mettre le plus petit bloc en une de la N-1
non avant postes, dans ce cas il n'est pas visible (d'où l' L
reste fixe).
Cette récursivité a l'avantage de toujours diminuant N
, si elle rend plus difficile de voir certaines formules, par exemple f(N,N-1) = (N choose 2)
. Cette formule est assez facile de montrer à partir de la formule précédente, bien que je ne suis pas sûr de la façon de dériver gentiment, à partir de ce simple récurrence.
Maintenant, pour revenir à l'origine du problème et résoudre b
, nous pouvons également prendre une approche différente. Au lieu de la somme avant, pensez à les blocs visibles comme venant de paquets, de sorte que si un bloc est visible à partir de la gauche, puis son paquet se compose de tous les blocs de droite et en face du bloc suivant, visible à partir de la gauche, et de même, si un bloc est visible à partir de la droite alors son paquet contient tous les blocs à gauche jusqu'au prochain bloc visible à partir de la droite. Faites cela pour tous, mais le plus grand bloc. Ce qui rend pour l' L+R
des paquets. Compte tenu de la forme de paquets, vous pouvez déplacer l'un du côté gauche au côté droit, simplement en inversant l'ordre des blocs. Donc le cas général, b(N,L,R)
réduit en réalité à la résolution du cas b(N,L,1) = f(N,L)
, puis de choisir les paquets à mettre sur la gauche et qui, sur la droite. Par conséquent, nous avons
b(N,L,R) = (L+R choose L) * f(N,L+R)
Encore une fois, cette reformulation a certains avantages par rapport à la version précédente. Mettre ces deux dernières formules, il est beaucoup plus facile de voir la complexité de l'ensemble du problème. Cependant, je préfère encore la première approche pour construire des solutions, mais peut-être que d'autres personnes ne seront pas d'accord. Dans l'ensemble, il va juste pour montrer il y a plus d'une bonne façon d'aborder le problème.
Ce qui est avec les nombres de Stirling?
Comme Jason points, l' f(N,L)
numéros sont précisément les (non signé) nombres de Stirling de première espèce. On peut le voir immédiatement à partir de la récursivité des formules pour chacun. Cependant, il est toujours agréable d'être en mesure de voir directement, donc voilà.
La (non signé) nombres de Stirling de Première Espèce, notée S(N,L)
de compter le nombre de permutations de l' N
en L
des cycles. Compte tenu d'une permutation écrit dans le cycle de la notation, nous écrivons la permutation dans la forme canonique en début du cycle avec le plus grand nombre dans ce cycle et puis, ordonnant que les cycles de plus en plus par le premier numéro du cycle. Par exemple, la permutation
(2 6) (5 1 4) (3 7)
serait écrite dans la forme canonique comme
(5 1 4) (6 2) (7 3)
Maintenant déposer les parenthèses et les avis que si ce sont les hauteurs des blocs, puis le nombre de blocs visibles à partir de la gauche est exactement le nombre de cycles! C'est parce que le premier nombre de chaque cycle de blocs de tous les autres numéros dans le cycle, et le premier numéro de chaque cycle est visible derrière le cycle précédent. D'où ce problème est vraiment juste une façon détournée de vous demander de trouver une formule pour les nombres de Stirling.