Вступ
Припустимо, ви і ваш друг граєте в гру. Ваш друг думає про певну послідовність nбітів, а ваше завдання - вивести послідовність, задаючи їм питання. Однак єдиний тип запитань, який ви можете задавати, - це "Як довго триває найдовша загальна послідовність вашої послідовності та S", де Sє будь-яка послідовність бітів. Чим менше питань вам потрібно, тим краще.
Завдання
Ваше завдання - написати програму або функцію, яка приймає як вхід додатне ціле число n, так і двійкову послідовність Rдовжини n. Послідовність може представляти собою масив цілих чисел, рядок або якийсь інший розумний тип на ваш вибір. Ваша програма виводить послідовність R.
Вашій програмі не дозволяється Rбезпосередньо отримувати доступ до послідовності . Тільки , що це дозволено зробити , Rце дати йому в якості вхідних даних для функції len_lcsпоряд з іншою двійковій послідовністю S. Функція len_lcs(R, S)повертає довжину найдовшого загального підпорядкування Rта S. Це означає, що найдовша послідовність бітів, яка виникає як (не обов'язково суміжний) підряд у обох Rі S. Входи len_lcsяких можуть бути різної довжини. Програма повинна Rкілька разів викликати цю функцію та інші послідовності, а потім реконструювати послідовність Rна основі цієї інформації.
Приклад
Розглянемо вхідні дані n = 4та R = "1010". По-перше, ми можемо оцінити len_lcs(R, "110"), що дає 3, оскільки "110"це найдовша спільна послідовність "1010"та "110". Тоді ми знаємо, що Rвиходить "110", вставляючи один біт в деяку позицію. Далі ми можемо спробувати len_lcs(R, "0110"), що повертається, 3оскільки найдовші загальні підпорядкування є, "110"і "010"тому "0110"невірно. Потім ми намагаємося len_lcs(R, "1010"), що повертається 4. Тепер ми це знаємо R == "1010", тому можемо повернути цю послідовність як правильний вихід. Для цього було потрібно 3 дзвінки len_lcs.
Правила та оцінка
У цьому сховищі ви знайдете файл із назвою, subsequence_data.txtщо містить 100 випадкових двійкових послідовностей довжиною від 75 до 124. Вони були згенеровані, взявши три випадкові поплавці між 0 і 1, взявши їх середнє значення a, а потім перевернувши aнахилену кількість монет n. Ви набираєте середню кількість дзвінків уlen_lcs цих послідовностях, нижчий бал - кращий. У вашому записі має бути записана кількість дзвінків Немає часових обмежень, за винятком того, що перед запуском програми слід запустити програму у файлі.
Ваше подання має бути детермінованим. PRNG дозволені, але вони повинні використовувати сьогоднішню дату 200116(або найближчий еквівалент) як випадкове насіння. Вам не дозволяється оптимізувати ваші подання стосовно цих конкретних тестових випадків. Якщо я підозрюю, що це відбувається, я генерую нову партію.
Це не код гольфу, тому вам рекомендується писати читабельний код. Код Розетта має сторінку про найдовшу загальну послідовність ; ви можете використовувати це для втілення len_lcsвашою мовою.
lcsзамість нього len_lcs.
lcs(R, "01"*2*n)повертається R. ;) Але це може спрацювати, якщо дзвінок lcs(R, S)збільшить бал len(S)замість 1, або щось подібне ...