2011年1月1日土曜日

Project Euler

■088
長さnの数列(ak)を作る.
但し,任意のkについて,
2≦ak<ak+1
この時,
Σ=Σk ak
Π=Πk ak
と置き,
1+…+1+Σ=1*…*1*Π
が成り立つとすれば,1の個数mは
m=Π-Σ
となる.
よって,総和(総積)がΠであり長さがn+mの数列が出来たことになる.
Σ,Πは再帰で生成するが,再帰回数nは12000程度で十分である(と思う,それ以上の長さを生成しても意味が無いから).
min[len]=条件を満たす長さlenの数列の総和(総積)の最小値
として,minを更新していく.

■098
それぞれの文字列をASCIIでソート.ソートした後の文字列群で等しいものがアナグラム対となる.アナグラム対(s, t)に対して,桁数がsの長さである自乗数を全て生成する.sとある自乗数mを対応させ,アルファベット->数字のマッピングを作る.条件を満たさない(違うアルファベットに同じ数字が割り当てられる等)マッピングになるときはそこで終了する.マッピングを用いてtに対応する数値nを生成.nが自乗数ならすべての条件を満たしたことになる.
これらを満たすもののうち,最大のものを見つければ良い.

■151
[仕事の回数][A1の枚数][A2の枚数][A3の枚数][A4の枚数][A5の枚数]=その組み合わせが起こる確率
でDP.
考えられる組み合わせ全てについて,
dp[k][b1][b2][b3][b4][b5]+=dp[k-1][a1][a2][a3][a4][a5]*ak/(a1+a2+a3+a4+a5)
で更新.akを引いたとし,その後のそれぞれの紙の枚数をb1,b2,b3,b4,b5とする.
例えば,a3を引いたとしたら,
b1=a1
b2=a2
b3=a3-1
b4=a4+1
b5=a5+1
となる.

これで,ついに150問に到達し,Level 4となりました.

0 件のコメント: