2012-03-14 4 views
2

Недавно я наткнулся на следующий вопрос во время интервью.Количество Количество возможных последовательностей

Существует последовательность {a1, a2, a3, a4, ..... aN}. Пробег - это строго строго возрастающая или строго убывающая непрерывная часть последовательности. Например. Если у нас есть последовательность {1,2,3,4,7,6,5,2,3,4,1,2} У нас есть 5 возможных пробегов {1,2,3,4,7}, , {2,3,4}, {4,1} и {1,2}.

Данные четырех цифр N, M, K, L. Подсчитайте количество возможных последовательностей номеров N, которые имеют ровно M, каждое из номеров в последовательности меньше или равно K, а разница между соседними номерами меньше L.

+4

И как вы пытались его решить? – Josh

+0

И особенно, где вопрос? –

+0

В третьем абзаце есть реальный вопрос. Я просто отредактировал, чтобы соответствующим образом отделить абзацы. – ElKamina

ответ

1

Возможно, существует возможность анализировать его аналитически и придумать решение O (1). Тем не менее, это займет кого-то гораздо умнее, чем я, чтобы понять :) Вот решение динамического программирования.

Я принимаю за это решение, что все значения должны быть положительными. Кроме того, я предполагаю, что все значения в последовательности должны быть неравными с предыдущим значением. Оба эти условия, по-видимому, подразумеваются, но в явном виде не сформулированы.


Во-первых, давайте немного изменить эту проблему таким образом, что, в дополнение к N, M, K и L, мы также присваивают значение последнего члена в последовательности применяется п. Давайте также добавим еще одну переменнуюI, которая представляет, является ли последний член частью увеличивающейся или уменьшающейся последовательности. Затем мы определим функцию F, чтобы вернуть число возможных последовательностей, заданных , всех этих значений.

N = number of values in sequence 
M = number of "runs" in the sequence 
K = max value allowed 
L = max difference between adjacent sequence terms 
I = whether the last term is increasing or decreasing 
an = last term in the sequence 
FK,L(N,M,I,an) = number of possible sequences, given all these values

Теперь, если мы имели возможность вычислить F, мы могли бы просто просуммировать все возможные значения п(от 1 до K) и I, чтобы получить ответ на вашу проблему.


Предположим, что I = «увеличение». Мы хотим выразить F K, L (N, M, «увеличение», п а) в терминах «меньше» значения F, поэтому мы можем рекурсивно вычислять значения F, чтобы получить окончательное значение , Мы сделаем это, суммируя значение F по всем возможным значениям a n-1; то есть, по сути, мы говорим, что F равно к числу действительных последовательностей длины N-1 что может конец в п, то представьте себе, добавляя п к каждому из них.

Потому что мы знаем п является частью возрастающей последовательности (I = "увеличение"), мы знаем, что п-1 < п (мы будем скоро получите к другому делу). Мы также знаем, что п-1 должна быть в пределах L от п-1; Таким образом, макс (1, а п - Л) < = а п-1 < п.

Теперь мы имеем два случая, чтобы рассмотреть, в зависимости от того предыдущего срока п-1 было увеличение или уменьшение:

  1. п-1 был увеличение. Тогда мы все еще растет, так что значение F мы заинтересованы в том,
    Р К, L (N-1, М, «повышение», А н-1).
  2. п-1 был уменьшение. a n В настоящее время увеличивается, так что теперь будет еще один «запуск» значений. Таким образом, значение F мы заинтересованы в том,
    Р К, L (N-1, М-1, "уменьшение", А н-1).

Мы просуммировать все эти случаи для всех возможных значений п-1, чтобы получить значение F K, L (N, M, "растущий", А п). Мы можем найти F K, L (N, M, "уменьшение", а п) аналогичным образом, только мы ограничить п-1 к п < n-1 < = min (K, a n + L), и мы вычитаем 1 из M в случае № 1, а не в случае № 2.


И наконец, мы указываем базовые чехлы.F K, L (N, M, I, a n): 0, если M < 1 или M> N; 1, если N = 1.

Затем, как было отмечено выше, только суммирование по всем значениям I и п в F K, L (N, M, я, п), чтобы получить ответ к вашей оригинальной проблеме. Сложность выполнения - O(KMN)

0

Я сломал бы проблему следующим образом. Трассы должны чередоваться между увеличением и уменьшением, поэтому важными числами являются то, где направление поворачивается. Для приведенного выше примера, важные цифры 1 - 7 - 2 - 4 - 2, как отмечено ниже:

(1,2,3,4,7,6,5,2,3,4,1,2) 
x  x  x x x x 

Предположим, что вы уже дали свои позиции и значения этих точек поворота, например у вас есть

(1,7,2,4,1,2) 

Затем мы хотим подсчитать количество способов прокладки между цифрами. Это зависит только от N и L, потому что мы уже используем ограничения от K и M, чтобы сделать этот скелет. Правило здесь состоит в том, что недостающие числа являются монотонными между заданными числами и не прыгают более чем на L. Это простая задача подсчета (подробности должны быть позже).

Следующая подсчитать количество скелетов, которое зависит только от K и M (графа для заполнения их может быть 0 на основе N и L). Что мы знаем об этом? Без зазоров это должна быть чередующаяся последовательность (вверх-вниз-вниз) длины M+1 со значениями между 1 и K. Опять же, это well studied и нетрудно подсчитать.

Единственное колебание, которое у меня есть для этого подхода, заключается в том, что нет простого способа объединить эти два счета, поэтому он не даст чистой формулы. Тем не менее, это по-прежнему большое улучшение по сравнению с исчерпывающим перечислением решений, и, возможно, идея может быть улучшена далее, чтобы дать замкнутую или чисто рекурсивную формулу.

+0

Я считал это, но это казалось тупиковым. Например, как вы примирите тот факт, что некоторые наборы значений недопустимы для некоторых «скелетов», но не для других (например, если 'L = 2', а ваши первые два значения равны 1 и 7, то первые две позиции должны быть не менее 3 указаний)? –

+0

@ BlueRaja-DannyPflughoeft Я не вижу необходимости «смириться» с этим ... иногда есть 0 решений. Я согласен, что это не самый чистый ответ. – PengOne

+0

Что я имел в виду, это нужно учитывать, или ваше уравнение счета будет считать «скелеты», которые на самом деле не являются действительными решениями. –

0

Вот некоторые подсказки:

Почтовые теги, кажется, предполагает, что это было телефонное интервью, что означает, что вы должны знать о эйлеровых числах. Более конкретно, количество перестановок N с общим количеством M восходящей плюс нисходящей трасс дается от 2 * А (N, M/2-1) также записывается в виде

2*/ N \ 
    \ M/2 - 1/

, которая может быть решена рекурсивно, как 2 раза в результате:

let x = M/2-1; then 
A(n,x)=(n-x)*A(n-1,x-1)+(x+1)*A(n-1,x) 

Два дополнительных ограничения, k и L, предназначены для управления формой циклов перестановки. например, если L = 3, то перестановка {9,1,3,6,2} не допускается, поскольку в цикле [1,2,9] 9 слишком велико.

Ваше резюме, вероятно, красит вас как эксперта по комбинаторике, что просто означает, что вам нужно пересмотреть свои школьные заметки. Во всяком случае, я надеюсь, это вас подведет.

+0

* «Два дополнительных ограничения, k и L, должны управлять формой циклов перестановки». * - правый, поэтому этот подход фактически не работает ... –

 Смежные вопросы

  • Нет связанных вопросов^_^