質問の意味:城に閉じ込められた男は、それN道路の前に、彼はメートル万人を持っていた、すべての道を選択するには、Pによって確率、q個の確率出会い兵士、1-PQ確率通行不能の道路を持っている;場合兵士たちは、その後、足りないお金、殺害された場合には、万人を引き渡す必要があり、最適な状況の確率を逃れるために管理することができますどのくらい尋ね
アイデアは、最初のデータで処理され、我々は早いほど良い、限り、それは最初のP / Qに従ってデータを並べ替える必要がありますので、それは、兵士を必要と触れないように可能な限り、それは保証することができて殺されることなく、確かに最善をしたいです死の最大確率は、その後の方程式によって確率DPに対する解決策を持っています
DP [I] [J]がI例jの数百万の方法を表し
ここで、i番目の道路のエスケープdpが[i]の[j]は*パイ、i番目の道路と殺さ遭遇兵士なしを推測することができている場合、DP [I + 1] [J-1]気の* i番目の道路障壁がDPに折り畳まれるDP [I]、[J]、[I] [J] *(1-PI-チー)
注:確率は、すべての時間は+ =、その配列のDPをクリアすることを忘れないことですので
----------------
、この記事では、元の記事CSDNブロガー「WShuo97」で、次の免責事項は、 BY-SAの著作権契約CC 4.0は、再現し、元のソースのリンクと、この文を添付してください。
オリジナルリンクします。https://blog.csdn.net/kuhuaishuxia/article/details/52042586
1の#include <cstdioを> 2の#include <CStringの> 3の#include <アルゴリズム> 4 使って 名前空間STDを、 5 のconst int型 MAXN = 1000年 + 5 。 6 構造体通路 7 { 8 ダブルP、Q。 9 ブール 演算子 <(CONST通路&R) 10 { 11 リターン P / Q> RP / RQ。 12 } 13 } [MAXN]。 14 二重DP [MAXN] [MAXN]。 15 のint main()の 16 { 17 のint T。 18 のscanf(" %dの"、&T)。 19 のために(INT T = 1 ; T <= T、T ++ ){ 20 のint N、M。 21 のscanf(" %D%dの"、&N、&M)。 22 のために(int型 i = 1 ; iが<= N; iが++ ){ 23 のscanf(" %のLFの%のLF "、および[I] .P、&[I] .Q)。 24 } 25 ソート(+ 1、A + 1個の + N)。 26 のmemset(DP、0、はsizeof (DP))。 27 DP [ 1 ] [M] = 1.0 。 28の ダブル ANS = 0 ; 29 のためには、(int型 i = 1 ; iが<= N; I ++ ) 30 のための(INT J = M; J> = 0 ; j-- ){ 31 、DP [I + 1 ] [J- 1 ] + = [I] .Q * DP [I] [J]。 32 DP [I +は1 ] [J] + = DP [I] [J] *(1 -a [I] .p- A [i]の.Q)。 33の ANS + = DP [I] [J] * [I] .P。 34 } 35 のprintf(" ケース%のD:%.5lf \ n " 、T、ANS)。 36 } 37 リターン 0 。 38 }