「メダルツアー」問題
http://riverplus.hatenablog.com/entry/2018/02/25/143351
自然数 w, h に対し、横と縦の長さがそれぞれ w, h となる格子状の道を考えます。
さらに、自然数 m に対し、左から m 番目の縦の道の、各交差点の中間にメダルが 1 個ずつ置いてあります。
例えば下図は、w, h, m = (4, 3, 2) のときの様子です。
この図の左下の点からスタートして、右上のゴールまで最短距離で向かいます。
途中で通過したメダルはすべて拾います。
取り得る経路を等しい確率で選ぶとき、拾うメダルの個数の期待値を F(w, h, m) と定義します。
例えば F(3, 2, 2) = 0.5 です。
取り得る経路は下図の 10 通りで、そのうちメダルを 2 個拾うものが 1 通り、1 個拾うものが 3 通り、0 個拾うものが 6 通りです。
したがって、期待値は 2×(1/10)+1×(3/10)+0×(6/10) = 0.5 と計算できます。
同様に、F(1, 1, 1)=0.5, F(2, 1, 3)=1/3, F(4, 3, 2)=0.6 となることが確かめられます。
小数点以下が 7 桁になるよう四捨五入した F(10, 10, 3) の値を求めて下さい。
=================================================================
末尾に示す簡単なプログラムで w, h の小さい部分についての解を求めると結果は以下のようになる
この問題において,m は解に無関係であることはすぐに分かる
関係性は,ずばり,h/(w+1)
f = function(w, h, m) {
g = function(k) {
x = y = integer(wh+2)
x[1] = y[1] = 1
p = integer(wh)
p[k] = 1
for (i in 1:wh) {
if (p[i] == 1) {
x[i+1] = x[i]+1
y[i+1] = y[i]
} else {
x[i+1] = x[i]
y[i+1] = y[i]+1
}
}
count = 0
for (i in 1:wh1) {
if (x[i] == m && x[i+1] == m && y[i+1]-y[i] == 1) {
count = count+1
}
}
return(count)
}
wh = w+h
wh1 = wh+1
a = combn(wh, w, g)
b = table(a)
l = length(b)
value = as.integer(names(b))
e = 0
for (i in 1:l) {
e = e+value[i]*b[i]
}
return(e/sum(b))
}
別解,解説
最新の画像[もっと見る]
- 算額(その2135) 11時間前
- 算額(その2134) 18時間前
- 算額(その2133) 1日前
- 算額(その2132) 3日前
- 算額(その2131) 4日前
- 算額(その2130) 4日前
- 算額(その2129) 5日前
- 算額(その2128) 5日前
- 算額(その2127) 6日前
- 算額(その2126) 6日前
※コメント投稿者のブログIDはブログ作成者のみに通知されます