소개
당신과 당신의 친구가 게임을하고 있다고 가정하자. 친구는 특정 순서의 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"
. 그런 다음 특정 위치에 1 비트를 삽입 R
하여 얻은 것을 알 수 "110"
있습니다. 다음으로, 가장 긴 공통 서브 시퀀스가 and 이므로 len_lcs(R, "0110")
리턴하는을 시도해 볼 수 있습니다 . 그런 다음 을 반환합니다 . 이제 우리는 그 시퀀스를 올바른 출력으로 반환 할 수 있다는 것을 알고 있습니다. 에 3 번의 전화가 필요했습니다 .3
"110"
"010"
"0110"
len_lcs(R, "1010")
4
R == "1010"
len_lcs
규칙과 득점
에서 이 저장소 , 당신은라는 파일을 찾을 수 있습니다 subsequence_data.txt
(75) 및 (124) 사이의 길이의 100 개 무작위 이진 시퀀스 그들은, 0과 1 사이의 세 가지 임의 수레를 가지고 그들의 평균하여 생성 된 포함 a
AN, 다음 뒤집기 a
-biased 동전 n
번. 점수는 이 시퀀스에 대한 평균 통화 횟수이며len_lcs
, 점수가 낮을수록 좋습니다. 제출 한 통화 수를 기록해야합니다. 제출하기 전에 파일에서 프로그램을 실행해야한다는 점을 제외하고 시간 제한이 없습니다.
귀하의 제출은 결정 론적이어야합니다. PRNG는 허용되지만 오늘 날짜 200116
(또는 가장 가까운 것)를 임의의 시드로 사용해야합니다 . 이러한 특정 테스트 사례에 대해 제출을 최적화 할 수 없습니다. 이것이 일어나고 있다고 생각되면 새로운 배치를 생성합니다.
이것은 코드 골프가 아니므로 읽을 수있는 코드를 작성하는 것이 좋습니다. Rosetta Code는 가장 긴 공통 서브 시퀀스에 대한 페이지를 가지고 있습니다 . 이를 사용 len_lcs
하여 선택한 언어 로 구현할 수 있습니다.
lcs
대신에 액세스 할 수있는 곳이라고 생각합니다 len_lcs
.
lcs(R, "01"*2*n)
돌아갑니다 R
. ;) 그러나 전화하는 lcs(R, S)
것이 len(S)
1 대신에 점수를