トピックポータル(内部質問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 ++