Возможно, вы запомнили конкретные детали неправильно или неверно истолковали вопрос?
В описании, элемент в положении б ограничено в - Ь ≠ ± M .
Но если они просто имели в виду, что разница была ограничена: a - b ≠ M ,
тогда проблема кажется решаемой.aba−b≠±M
a−b≠M
Я решил эту более простую проблему и попытался обобщить таким образом, который, как я надеялся, мог бы дать некоторую свободу в решении более масштабной проблемы. Но это только прояснило для меня, почему рекурсивный подход очень маловероятен, что я обсуждаю в конце.
Рассмотрим функцию которая дает число перестановок списка элементов, помеченных от 1 до N , где элемент a в позиции b (первая позиция равен 1) удовлетворяет a - b ≠ M , а b - ≠ P .f(N,M,P)Naba−b≠Mb−a≠P
Чтобы визуализировать это, разделение на два ограничения позволяет и P сдвигать эти ограничения по отдельности.MP
1 2 3 4 5 M=0, restricted values for each position
. . . . . (positions in list)
1 2 3 4 5 P=0, restricted values for each position
3 4 5 M=2, restricted values for each position
. . . . . (positions in list)
1 2 3 4 P=1, restricted values for each position
Для удобства, когда чтобы не накладывать ограничений на перестановки, определим g ( N , M ) = f ( N , M , P ) . Аналогично, g ( N , P ) = f ( N , M , P ), когда M ≥ N, так что это не накладывает ограничений на перестановки.P≥Ng(N,M)=f(N,M,P)g(N,P)=f(N,M,P)M≥N
В частном случае ограничения из M и P эквивалентны, поэтому можно игнорировать, что позволяет нам записать f в терминах g :
f ( N , 0 , 0 ) = g ( N , 0 ) .M=P=0MPfg
f(N,0,0)=g(N,0).
Из симметрии задачи:
f(N,M,P)=f(N,P,M)
Давайте сначала решим для , а затем займемся более общим f ( N , M , P ) .g(N,M)f(N,M,P)
Для каждый элемент имеет одно ограничение размещения (и ограничения различны). Таким образом, выбрав некоторый элемент i , мы поместим его в какую-то позицию j . Есть N - 1 различных возможностей для выбора j .M=0ijN−1j
Этот выбор удалил ограниченную позицию для элемента , в то время как другие ( N - 2 ) элементы все еще имеют одно ограничение. Мы можем разбить размещение j на два варианта:j(N−2)j
Место в . Это оставляет все остальные элементы с одним ограничением, поэтому оставшаяся проблема размещения теперь сводится к g ( N - 2 , 0 ) .ig(N−2,0)
Поместите в положение . Теперь это дает одно ограничение размещения для j , и поэтому у каждого элемента есть одно ограничение, а оставшаяся проблема размещения уменьшается до g ( N - 1 , 0 )≠ijg(N−1,0)
Таким образом, это дает рекурсивную формулу:
g(N,0)=(N−1)[g(N−2,0)+g(N−1,0)]
И, взглянув на простые ситуации вручную, можно получить базовые случаи.
g(1,0)=0, g(2,0)=1
Это обычная рекурсивная формула расстройства.
Хотя я не могу себе представить, чтобы кто-то придумал это на месте, оказалось также, что для этого есть решение в закрытой форме (подробности см. В вики-статье о расстройствах ).
g(N,0)=⌊n!e+12⌋
Для нет ограничений на размещение:M≥N
(M≥N)⟹g(N,M)=N!
При первые M элементов не будут иметь ограничений, а остальные элементы будут иметь одно ограничение размещения. Это сроки позиций, последние M позиций позволят все номера.0<M<NMM
Для последней позиции выберите элемент . Есть две возможности для того, как выглядит оставшееся место размещения:i
Если , то у меня не было ограничений на размещение, поэтому использование i не меняет ограничений на любую позицию. Мы также удалили одну позицию без ограничений, поэтому оставшаяся позиция выглядит как g ( N - 1 , M - 1 ) .i<Miig(N−1,M−1)
Если , то у меня было ограничение размещения, и мы удалили одну позицию без ограничений. Поскольку я помещен, позиция, с которой он был ограничен, может принять любое из оставшихся номеров. Таким образом, оставшееся размещение выглядит как g ( N - 1 , M ) .i>=Miig(N−1,M)
Таким образом, это дает рекурсивную формулу:
(0<M<N)⟹g(N,M)=(M−1)g(N−1,M−1)+(N−M+1)g(N−1,M)
Это заканчивает рекурсивное решение для .g
Когда , первые позиции N - M имеют ограничение по одному номеру, последние позиции N - P имеют ограничение по одному номеру, а средние позиции M + P - N не имеют ограничений. Это похоже на случай g ( N , M + P - N ) .M+P≥NN−MN−PM+P−Ng(N,M+P−N)
(M+P)≥N⟹f(N,M,P)=g(N,M+P−N)
В настоящее время мы обработали все случаи, кроме и 0 < P < N, таких что M + P < N . Здесь некоторые элементы имеют несколько ограничений. Из-за симметрии по f мы можем рассмотреть 0 < M ≤ P < N без ограничения общности.0<M<N0<P<NM+P<Nf0<M≤P<N
Первые позиции будут иметь одно ограничение, затем N - M - позиции P с двумя ограничениями, затем последние позиции M имеют одно ограничение.PN−M−PM
Глядя на элементах, первые элементы будут иметь один ограничение, то Н - М - Р элементы имеет два ограничения, то последние P элементы имеют одну ограничения.MN−M−PP
Однако на этом мы должны покончить. Как нет пути вперед с этим методом.
Я отделил два ограничения , потому что я мог видеть , что размещение числа в выбранном положении может разбалансировать , сколько одиночные стесненных позиций были для «+» ограничения и «-» скованности .a−b≠±M
Но в более общей проблеме удаление позиции путем помещения в нее числа не всегда приводит к подзадаче, которая описывается с помощью .f(N,M,P)
2NN{A1,A2,...,AN}{B1,B2,...,BN}(Ai,Bj)i−j=M(Bj,Ai)j−i=MM≠0
AB
Итак, нам нужна функция, которая принимает в качестве входных данных этот граф ограничений и выводит количество перестановок, которые удовлетворяют ограничениям.
M+P≥N
0<M≤P<NNN!
Поскольку существует множество возможных подграфов, когда разрешены цепочки, я действительно не понимаю, как это можно решить с помощью обычных рекурсивных методов, если нет умного отношения, говорящего о том, что неизоморфные графы ограничений каким-то образом эквивалентны количеству перестановок.
Я думаю, что, скорее всего, вопрос был неверно истолкован. Возможно, даже интервьюером (который, возможно, забыл подробности ответа).