이전 에 확률을 빠르고 정확하게 계산하는 방법에 대한 질문 을했습니다. 그러나 폐쇄 형 솔루션이 제공되어 너무 쉬웠습니다! 더 어려운 버전이 있습니다.
이 작업은 확률을 정확 하고 신속하게 계산하기위한 코드 작성에 관한 것입니다 . 결과는 가장 축소 된 형태로 분수로 쓰여진 정확한 확률이어야합니다. 즉, 출력 4/8
하지 말고 오히려 출력해야합니다 1/2
.
양의 정수의 경우 n
, 길이가 1과 -1 인 균일하게 임의의 문자열을 고려하여 n
A라고 부르십시오. 이제 A
자체 사본으로 연결하십시오 . 즉 A[1] = A[n+1]
색인 경우 1, A[2] = A[n+2]
등등. A
이제 길이가 2n
있습니다. 이제 n
첫 번째 n
값이 각각 1 / 4,1 / 2, 1/4 인 -1, 0 또는 1 인 길이 의 두 번째 임의의 문자열을 고려하여 B라고 부릅니다.
이제 B
와 A[1+j,...,n+j]
다른 내부 제품을 고려하십시오 j =0,1,2,...
.
예를 들어을 고려하십시오 n=3
. 가능한 값 A
및 B
수 A = [-1,1,1,-1,...]
및 B=[0,1,-1]
. 이 경우 처음 두 개의 내부 제품은 0
및 2
입니다.
직무
각각의 경우 j
, j=1
코드는 첫 번째 j+1
내부 제품이 모두 0 일 확률을 출력해야 합니다 n=j,...,50
.
Martin Büttner가 생산 한 표를 복사하면 j=1
다음과 같은 샘플 결과가 나타납니다.
n P(n)
1 1/2
2 3/8
3 7/32
4 89/512
5 269/2048
6 903/8192
7 3035/32768
8 169801/2097152
점수
j
내 컴퓨터에서 1 분 안에 코드가 완료 되는 최대 점수입니다 . 조금 명확히하기 위해 각각 j
1 분이 걸립니다. 앞의 링크 된 질문에서 다이나믹 프로그래밍 코드는이 작업을 쉽게 수행 할 수 있습니다 j=1
.
타이 브레이커
두 항목이 같은 j
점수를 얻는 경우 당첨 된 항목은 n
내 컴퓨터에서 1 분 동안 최고 점수를 얻은 항목이됩니다 j
. 이 기준에서 두 개의 최고 출품작이 동일한 경우 승자가 먼저 제출 된 답변이됩니다.
언어와 라이브러리
원하는 언어와 라이브러리를 자유롭게 사용할 수 있습니다. 코드를 실행할 수 있어야하므로 가능한 경우 리눅스에서 코드를 실행 / 컴파일하는 방법에 대한 자세한 설명을 포함하십시오.
내 컴퓨터 타이밍이 내 컴퓨터에서 실행됩니다. 이것은 AMD FX-8350 8 코어 프로세서에 표준 우분투 설치입니다. 이것은 또한 코드를 실행할 수 있어야 함을 의미합니다.
수상작
j=2
에서 파이썬 미치 슈워츠.j=2
에서 파이썬 feersum에 의해. 현재 가장 빠른 항목입니다.