알고리즘 --- 보 너 스 만두
설 을 쇠 자 엄 마 는 만두 100 마 리 를 만 들 었 는데 그 중 10 마리 에 동전 1 개가 들 어 있 었 다.샤 오 밍 은 이 100 마리 의 만 두 를 차례대로 먹고 샤 오 밍 이 k 개의 동전 을 계속 먹 으 면 샤 오 밍 은 k - 1 개의 동전 을 받는다.
예 를 들 어 110111 은 만두 6 마리, 1 은 동전 이 있 음 을 나타 내 고 0 은 없 음 을 나타 낸다.11. 만두 2 개 를 연속 으로 먹 으 면 샤 오 밍 은 동전 1 개 를 받는다.111 연속 지각 3 개, 샤 오 밍 은 동전 2 개 얻 기;그래서 샤 오 밍 은 모두 세 개의 동전 을 받 았 다.
-- 샤 오 밍 이 받 은 동전 의 기대 치 는.
분석 하 다.
원 하 는 정의: E(X)=∑iXiP(Xi)
이 문제 에서 랜 덤 이벤트 X 는 샤 오 밍 이 최종 적 으로 얻 은 동전 의 수량 입 니 다. x * 8712 ° [0, 9]
계산 P (Xi) = cases (x = i) allcases
동적 계획 을 사용 하고 하위 문 제 는 다음 과 같이 정의 합 니 다.
그렇다면 전달 공식 은 다음 과 같다.
코드
1.DP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/usr/bin/env python
import sys
def compute(m,n,f,g):
if n > m:
return -
1
for i
in range(m+
1):
f[i][
0][
0] =
1
for j
in range(n+
1):
f[
0][j][
0] =
0
g[
0][j][
0] =
0
f[
0][
0][
0] =
1
g[
0][
0][
0] =
1
for i
in range(
1,m+
1):
for j
in range(
1,min(i,n)+
1):
for k
in range(
0,j):
f[i][j][k] = f[i-
1][j][k] + g[i-
1][j][k]
if k !=
0: g[i][j][k] = f[i-
1][j-
1][k] + g[i-
1][j-
1][k-
1]
else: g[i][j][k] = f[i-
1][j-
1][k]
cnt = [
0
for i
in range(n)]
for k
in range(
0,n):
cnt[k] = f[
100][
10][k] + g[
100][
10][k]
print cnt[
1:]
#(100, 10)
allSum =
1.0
for i
in range(
91,
101): allSum = allSum * i
for i
in range(
1,
11): allSum /= i
allSum2 =
0
for i
in range(
1,n): allSum2 += (i * cnt[i])
print allSum2/float(allSum)
if __name__ ==
"__main__":
m =
100
n =
10
k = n-
1
f = [[[
0
for k
in range(k+
1)]
for j
in range(n+
1)]
for i
in range(m+
1)]
g = [[[
0
for k
in range(k+
1)]
for j
in range(n+
1)]
for i
in range(m+
1)]
compute(m,n,f,g)
2. 시 뮬 레이 션
컴퓨터 로 시 뮬 레이 션 할 수 있 습 니 다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/bin/python
import random
def helper(vec):
flag =
False
count =
0
for i
in range(len(vec)):
if vec[i]:
if flag: count +=
1
else: flag =
True
else:
flag =
False
return count
N =
100000
score =
0
cnt = [
0
for i
in range(
100)]
for i
in range(N):
count =
0
for i
in range(len(cnt)): cnt[i] =
0
while count <
10:
index = random.randrange(
0,
100)
if cnt[index]:
continue
count +=
1
cnt[index] =
1
score += helper(cnt)
print float(score) / N
결 과 는 약 0.9 정도 다.
뒷말
사실 이 문제 의 결 과 는 어느 정도 직관 에 어 긋 난다.기대 0.9 정도, 즉 평균 상황 에서 두 연속 1.
사실 이 문제 와 비슷 하 다. 수학 적 으로 생일 역설 이라는 유명한 역설 이 있다.
생일 역설 은 한 방 에 23 명 이나 23 명 이상 이 있 으 면 적어도 두 사람의 생일 이 같은 확률 이 50% 보다 높다 는 것 을 말한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java Predicate 살펴보기2 C# 개발자가Java Predicate 살펴보기2 이다 Predicate의 기본은 저번 게시글에서 작성했고 predicate 에서 default함수?로 구성되어 있는 "and, or, negate, isEqual, not" 5개...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.