Вопрос: В качестве входных данных передается набор чисел, разделенных пробелом. Программа должна печатать самую большую последовательность змеи, присутствующую в числах. Последовательность змеи состоит из смежных чисел, так что для каждого числа число справа или слева составляет +1 или -1 его значения. Если возможно несколько серий змейков максимальной длины, напечатайте последовательность змеи, появляющуюся в естественном порядке ввода.Самая длинная последовательность Snake в списке номеров
Пример ввода/вывода 1:
Входной сигнал:
9 8 7 5 3 0 1 -2 -3 1 2
Выход:
3 2 1 0 1
Пример ввода/вывода 2:
Входной сигнал:
-5 -4 -3 -1 0 1 4 6 5 4 3 4 3 2 1 0 2 -3 9
Выход:
6 5 4 3 4 3 2 1 0 -1 0 1 2
Пример ввода/вывода 3:
Входной сигнал:
5 6 7 9 8 8
Выход:
5 6 7 8 9 8
Я нашел программу в Python по этой ссылке: "Longest Snake in an array" как показано ниже, но он не выполняет следующий тестовый пример. Как упоминалось в вопросе в случае двух или более последовательности максимальной длины, программа должна печатать последовательность змеи, появляющуюся в порядке естественного ввода. Я подозреваю, что это параметр, создающий проблему.
Результат должен быть тем, что показывает эта программа, поскольку точка разницы равна 8 и 10. (Если я не ошибаюсь в отношении того, что означает естественный порядок) 8, появляющиеся до 10 в списке входных данных, должны быть взяты в последовательность для правильный выход вместо 10, но это не ожидаемый результат.
"""
Test case Input:
4 3 1 6 7 8 8 21 7 8 9 13 -1 2 14 9 10 11 10 9
Expected Output:
6 7 8 7 8 9 10 11 10 9 8 9
Your Program Output:
6 7 8 7 8 9 8 9 10 9 10 11
"""
from collections import Counter
def longest_snake(numbers,counts,path):
best = path
for n in sorted(counts, key = numbers.index, reverse=True):
if counts[n] > 0 and (path == [] or abs(path[-1] - n) == 1):
counts[n] -= 1
res = longest_snake(numbers,counts,path + [n])
if (len(res) > len(best)):
best = res
counts[n] += 1
return best
if __name__ == '__main__':
numbers = list(map(int, raw_input().split()))
output = longest_snake(numbers,Counter(numbers),[])[::-1]
print(' '.join(map(str,output)))
Каким образом '3 2 1 0 1' будет выводиться в примере 1? 3 не отображается рядом с 2 в любом месте входа. Не могли бы вы пояснить, как это должно работать? – camz
Как я уже говорил с этим другим парнем: вам нужно уточнить _exactly_, что означает «в естественном порядке». Если вы не знаете, попросите вашего учителя разъяснить. Как «6 7 8 7 8 9 10 11 10 9 8 9» больше «в натуральном порядке», чем '6 7 8 7 8 9 8 9 10 9 10 11'? –
Думаю, я это вижу. Выходная последовательность не является подпоследовательностью ввода, но вы можете использовать входные значения для создания последовательности змей в любом порядке? Извините за недоразумение – camz