「オイラープロジェクト381~390」の編集履歴(バックアップ)一覧に戻る

オイラープロジェクト381~390 - (2012/09/07 (金) 19:04:49) の編集履歴(バックアップ)


問い389

1つの偏りのない四面体のサイコロを振り、出た目Tを記録する。
T個の偏りのない六面体のサイコロを振り、出た目の合計Cを記録する。
C個の偏りのない八面体のサイコロを振り、出た目の合計Oを記録する。
O個の偏りのない十二面体のサイコロを振り、出た目の合計Dを記録する。
D個の偏りのない二十面体のサイコロを振り、出た目の合計Iを記録する。
Iの分散を四捨五入して小数点以下第4位まで求めよ。

この問題は難しい、最初読んだとき一瞬何を問われてるか意味がわからなかった。

とりあえず2段動的計画法をでっちあげて解こうとしてるもののコードが間違ってないかlong doubleで精度や桁数が足りるのか?
難しい。


#include<stdio.h>
//long doubleで精度が足らなかったらどうしよう、、、
long double memo6[25]={0},memo8[193]={0},memo12[2305]={0},memo20[46081]={0};
long double memo4[5]={0,1,1,1,1};//4つからスタート
//一般化しないとこの問題は難しすぎるので抽象化して解く
void calc(int d,int max,long double* multiMemo,long double* nextMemo){
//dはダイスの面数、maxはダイスの個数,multiMemo
long double memo[46081]={0};
for(int i=1;i<=max;i++){
	//動的計画法でさいころを転がす
	for(int j=max-d;j>=0;j--){
		memo[j+d]+=memo[j];
	}
	//i個転がした分をとりあえず次へ足す。
	for(int i=1;i<=max;i++){
		nextMemo[i]+=(memo[i]*multiMemo[i]);
	}
}
}
int main(){	

}