【NOIPシミュレーション試験]:じゃんけん(RPS)(確率DP)

トピックポータル(内部質問9)


入力形式

最初の行の整数$ n $という。次に、N- $ $ $ $ 3行の各非負整数の$ R_iを、P_I、S_I $。


出力フォーマット

行は、実数の答えを表します。文が正しい場合$ - {9}ときに、絶対または相対誤差は、標準的な答えを$ ^ {10}あなたの答えを超えていません。


サンプル

サンプル入力:

3
300 0 0
0 300 0
0 0 300

出力例:

6.333333333333


データ範囲とヒント

$ 10%$、$ N = 1 $のデータについて。
$ 30%$、leqslant 10 $ \ $ n個のデータのために。
すべての$ $ P_I、すべての$ $ R_iとの$ $の10%が等しいためのさらなるデータが同じです。
データのさらに別の$ $ 30%、$ R_iを= 0 $。
$ 100%$、$ 1 \ leqslant N \ leqslantのデータのための 50 $、$ R_iを+ P_I + S_I = 300 $。


問題の解決策

まず第一に、この質問は、偽の期待があります。

$ gを有する[I] [J] [K] $は$ iが$ K布を$ J + K $ Iに$ $ラウンド石、はさみの$ J $の確率を+です。

$のDPを有する[I] [J] [K] [L] $は、 iがJ + K $を+前面$表す$ I $石は、$ $シザースJの確率、K $ $布ラウンド。

[I] [X] + DP [I] [J] [K] [X] $ $ \最大$をフェッチが、$ DP我々は$ DP [I] [J] [K]ではないことに注意してください[J ] [K] [X + 1]回3 $ \ $ \最大$を取得します。

$ G [I] [J] [K] $も見つける非常に良い、直接式を使用して:$ G [I] [J] [K] = G [I-1]〜[J] [K]回R \ [T] + G [I] [J-1] [k]を時間S \ [T] + G [I] [J] [K-1] \回P [T] $。

その$のDPの$と$ G $の重要性に注意してくださいので、$ G $の転送は$ DPの$の後に必要とされます。

ノートの入力シーケンスがありますさ:石、布、はさみ、することができます。

時間の複雑さ:$ \シータ(N ^ 4)$。

希望のポイント:$ $ 100ポイント。

実際のサブ:$ $ 100ポイント。


コードの時間

#include <ビット/ STDC ++ H> 
名前空間STDを使用して、
int型のn; 
長い二重W [100]、Z [100]、C [100]。
長い二重C [51] [51]。
長いダブルG [51] [51] [51]、DP1 [51] [51] [51]、DP2 [51] [51] [51]、DP3 [51] [51] [51]。
長い二ANS; 
INTメイン()
{ 
	scanf関数( "%のD"、&N); 
	以下のために(INT i = 0; iが<= N; iは++)
	{ 
		C [i]が[0] = 1.0。
		(INT J = 1; J <= I; J ++)のために
			C [I] [J] = C [I-1]〜[J] + C [I-1] [J-1]。
	} 
	のための(INT i = 1; iが<= N; iが++)
	{ 
		CIN >> W [i]を>> C [I] >> Z [I]; //注意输入顺序
		W [I] / = 300.0。
		Z [I] / = 300.0。
		C [I] / = 300.0。
	} 
	G [0] [0] [0] = 1.0。
	用(INT T = 1; T <= N; T ++)
		のための(INT I = T;〜I; i--)
			用(INT J = TI;〜J; j--)
				のために(;〜K int型K = TIJ k--)
				{ 
					(!私はJ + Kを+ = t)であれば
					{ 
						IF(I)DP1 [I] [ J] [K] + = DP1 [I-1]〜[J] [K] * W [T]。
						IF(J)DP1 [I] [J] [K] + = DP1 [I]、[J-1] [K] * Z [T]。
						もし(K)DP1 [I] [J] [K] + = DP1 [I] [J] [K-1] * C [T]。
						DP1 [I] [J] [K] + = G [I] [J] [K] * W [T]。
						IF(I)DP2 [I] [J] [K] + = DP2 [I-1]〜[J] [K] * W [T]。
						IF(J)DP2 [I] [J] [K] + = DP2 [I]、[J-1] [K] * Z [T]。
						もし(K)DP2 [I] [J] [K] + = DP2 [I] [J] [K-1] * C [T]。
						DP2 [I] [J] [K] + = G [I] [J] [K] * Z [T]。
						IF(I)DP3 [I] [J] [K] + = DP3 [I-1]〜[J] [K] * W [T]。
						IF(J)DP3 [I] [J] [K] + = DP3 [I]、[J-1] [K] * Z [T]。
						もし(K)DP3 [I] [J] [K] + = DP3 [I] [J] [K-1] * C [T]。
						DP3 [I] [J] [K] + = G [I] [J] [K] * C [T]。
					}
					IF(I)G [I] [J] [K] + = G [I-1]〜[J] [K] * [T] W。
					IF(J)G [I] [J] [K] + = G [I] [J-1] [K] * Z [T]。
					もし(K)G [I] [J] [K] + = G [I] [J] [K-1] * C [T]。
				} 
	(i = 0、int型、iがN <; I ++)用の
		ための(INT J = 0; iがN <jは+; J ++)
			のための(INTのk = 0; kは++; iがJ + K <N +)
				ANS + = maxに( DP1 [I] [J] [K] + 3.0×DP2 [I] [J] [K]、MAX(DP2 [I] [J] [K] + 3.0 * DP3 [I] [J] [k]は、 DP3 [I] [J] [K] + 3.0×DP1 [I] [J] [K]))/(C [N])(NIJK)* [Iがj + kは+]。
	COUT <<固定<<てSetPrecision(12)<< ANS << ENDL。
	0を返します。
}

RP ++

おすすめ

転載: www.cnblogs.com/wzc521/p/11331681.html